使用Javascript从MongoDB返回值提取。
问题描述:
使用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' 到一个变量?
答
如果每个domain
一个记录,使用findOne
方法,
var hits = db.test_collection.findOne({dom:"seagoedd.org"},
{hits:true,_id:false})["hits"];
这工作,因为该方法返回一个文件。而find
将cursor
返回到结果列表。
注意:如果没有记录匹配,findOne
方法将返回您null
。在这种情况下,下面会更有意义:
var record = db.test_collection.findOne({dom:"seagoedd.org"},
{hits:true,_id:false})
var hits = record?record["hits"]:0;
试穿喜欢这个变种R = db.test_collection.find末尾添加.toObject()({DOM: “seagoedd.org”},{点击: true,_id:false})。toObject() – carterw485
在服务器上运行JavaScript代码(虽然支持)从来都不是一个好主意。这不是**“存储过程”,也不是MongoDB支持的概念。您的操作通常更适合使用聚合框架或mapReduce。忘记“证明概念”,因为如果你没有在正确的地方开始,你就走错了路。 –
至于基本问题。 **所有**(大多数)MongoDB操作实质上返回一个BSON对象(翻译成正在使用的语言的相关结构)。只有'.distinct()'会尝试返回任何其他值(数组数组)。代码的工作是以您希望使用它的方式从返回的对象中提取值,而不是数据库的工作来完成这种转换。 –