2016-03-07 76 views
0

使用JavaScript从MongoDB查询的返回中提取整数。使用Javascript从MongoDB返回值提取。

我打算为我的MongoDB设置创建一些服务器端处理的查询,使用JavaScript中的存储过程。作为概念验证,我试图从Mongo shell中现有的测试数据库中提取值的步骤,使它们可以在JavaScript中进行处理。

我的数据库包含的条目,其中包括一个域名,它已经看到的命中数:

{"dom":"domain1.org", "hits": 38} 
{"dom":"domain2.com", "hits": 12} 

对于概念验证,我想编写一个函数“addDomainHits”,这将做以下:

db.eval('addDomainHits("domain1.org","domain2.com")'); 
50 

[注1:我非常清楚,我可以使用MongoDB的聚合来执行这个特定的功能,但是这不是问题的答案;这只是一个概念证明;我实际上想在我实际编写的功能中多做一个批次。]

[注意2:是的,这是非常不安全的,并且可以用于代码注入。我会在稍后处理。再次,这只是概念验证。]

所以,我试图在MongoDB Shell中将整数值变成一个变量,这就是我遇到问题的地方。

$ mongo 
MongoDB shell version: 2.6.11 
connecting to: test 

> use test_database 
switched to db test_database 

> var r=db.test_collection.find({"dom":"domain1.org"},{hits:true,_id:false}) 
> r 
{ "hits" : 38 } 

现在,我想要得到的 '38' 变成简单的整型变量,所以我可以做类似的处理:

> a=2 
2 
> b=3 
3 
> a+b 
5 

,但没有喜悦:

> r=db.test_collection.find({"dom":"domain1.org"},{hits:true,_id:false}) 
> r 
{ "hits" : 38 } 

> var r=db.test_collection.find({"dom":"domain1.org"},{hits:true,_id:false}) 
> r.hits 
> 

公告没有价值得到返回

轻微变体:

> var r=db.test_collection.find({"dom":"domain1.org"},{hits:true,_id:false}) 
> var h=r.hits 
> h 
> 

OR

> var r=db.test_collection.find({dom:"seagoedd.org"},{hits:true,_id:false}) 
> var h=r['hits'] 
> h 
> 

所以,在这个例子中,我怎么能得到一个简单的 '38' 到一个变量?

+0

试穿喜欢这个变种R = db.test_collection.find末尾添加.toObject()({DOM: “seagoedd.org”},{点击: true,_id:false})。toObject() – carterw485

+0

在服务器上运行JavaScript代码(虽然支持)从来都不是一个好主意。这不是**“存储过程”,也不是MongoDB支持的概念。您的操作通常更适合使用聚合框架或mapReduce。忘记“证明概念”,因为如果你没有在正确的地方开始,你就走错了路。 –

+0

至于基本问题。 **所有**(大多数)MongoDB操作实质上返回一个BSON对象(翻译成正在使用的语言的相关结构)。只有'.distinct()'会尝试返回任何其他值(数组数组)。代码的工作是以您希望使用它的方式从返回的对象中提取值,而不是数据库的工作来完成这种转换。 –

回答

3

如果每个domain一个记录,使用findOne方法,

var hits = db.test_collection.findOne({dom:"seagoedd.org"}, 
            {hits:true,_id:false})["hits"]; 

这工作,因为该方法返回一个文件。而findcursor返回到结果列表。

注意:如果没有记录匹配,findOne方法将返回您null。在这种情况下,下面会更有意义:

var record = db.test_collection.findOne({dom:"seagoedd.org"}, 
            {hits:true,_id:false}) 
var hits = record?record["hits"]:0;