【问题标题】:Extracting a value from a MongoDB return, using Javascript.使用 Javascript 从 MongoDB 返回中提取值。
【发布时间】: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:是的,这是非常不安全的,并且可以进行代码注入。我稍后会处理。同样,这只是概念证明。]

所以,我尝试将整数值放入 M​​ongoDB 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


【解决方案1】:

如果每个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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2019-12-26
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多