【发布时间】:2016-03-08 08:59:29
【问题描述】:
在 Javascript 中从 MongoDB 查询的返回中提取一个整数。
我计划使用 javascript 中的存储过程为我的 MongoDB 设置创建一些服务器端处理的查询。作为概念验证,我正在尝试完成从 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
>
或
> var r=db.test_collection.find({dom:"seagoedd.org"},{hits:true,_id:false})
> var h=r['hits']
> h
>
那么,在这个例子中,我怎样才能将一个简单的 '38' 放入一个变量中?
【问题讨论】:
-
尝试像这样在末尾添加 .toObject() var r=db.test_collection.find({dom:"seagoedd.org"},{hits:true,_id:false}).toObject ()
-
在服务器上运行 JavaScript 代码(在受支持的情况下)从来都不是一个好主意。这不是“存储过程”,也不是 MongoDB 以任何方式支持的概念。您的操作通常最好适当地使用聚合框架或 mapReduce。忘记“证明概念”,因为如果你没有从正确的地方开始,你就走错了路。
-
关于基本问题。 ALL(大多数情况下)MongoDB 操作本质上返回一个 BSON 对象(翻译成所使用语言的相关结构)。只有
.distinct()会尝试返回任何其他内容(值数组)。以您希望使用的方式从返回的对象中提取值是您的代码的工作,而不是数据库的工作来进行此类转换。
标签: javascript mongodb stored-procedures javascript-objects