【问题标题】:Mongodb processing in stored procedures - BSON to JSON in javascript存储过程中的 Mongodb 处理 - javascript 中的 BSON 到 JSON
【发布时间】:2016-03-03 22:47:50
【问题描述】:

我有一个 mongodb 数据库,其中包含域的记录,并且每个“命中”的整数都已被看到。

record =
{
"dom" : "Somedomain.com",
"hits" : 23
}

我想写一些mongodb存储过程来处理服务器上的这些记录。 MongoDb 可以在 javascript 中存储过程。

我想(举一个简单的例子)获取两个域的点击次数的总和。在 Python/pymongo 中,我可以轻松地做到这一点 - 我可以获取 db.find({"dom": "domainname.com"}) 两个域的记录,将返回的记录解析为 JSON,提取命中数,然后添加它们。

但是,我似乎无法在 javascript 中做同样的事情。部分问题似乎是 find 返回的是 BSON,而不是 JSON,而且似乎没有本地方式来转换它。

> This is in the Mongo Shell, which is mostly javascript.

> var r = db.test_collection.find({dom:"somedomain.com"},{hits:true,_id:false})
> r
{ "hits" : 1043 }
> var j = JSON.parse(r)
2016-03-03T17:27:52.046-0500 SyntaxError: Unexpected token D

> var r = db.test_collection.find({dom:"somedomain.com"},{hits:true,_id:false}).valueOf() 
> r
{ "hits" : 1043 }
> var j = JSON.parse(r)
2016-03-03T17:27:52.046-0500 SyntaxError: Unexpected token D

这个“SyntaxError”的来源似乎是 BSON vs JSON

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

我无法在可以使用的地方获取“命中”值。

我可以在 Python 中使用 Pymongo 轻松做到这一点,但不能在 mongo shell 中,也不能在 javascript 中。

我希望存储的 javascript 程序能够从数据库中检索值并处理 他们,最终返回一个结果。但我无法得到实际值(在这种情况下,命中数) 这样做。有人吗?

【问题讨论】:

  • mongodb 不支持存储过程。我建议用一些示例 mongodb 文档来详细说明您的问题。同时发布您对尝试执行的操作的期望

标签: javascript json mongodb stored-procedures bson


【解决方案1】:

我认为MongoDB aggregation 可能是您正在寻找的。​​p>

你会这样做:

db.test_collection.aggregate( [
   { $group: { _id: "$dom", total: { $sum: "$hits" } } },
   { $match: { dom: { $or: ['somedomain.com', 'anotherdomain.com'] } } }
] )

上面只是一个简单的例子,我不知道你所有数据的确切结构,所以你可能需要稍微调整一下。 MongoDB 文档提供了与邮政编码和城市人口相关的出色聚合example

db.zipcodes.aggregate( [
   { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } },
   { $group: { _id: "$_id.state", avgCityPop: { $avg: "$pop" } } }
] )

另外,请记住,您不必这样做var j = JSON.parse(r)。 MongoDB 查询返回普通的旧 JavaScript 对象。

【讨论】:

  • 很高兴有人提到了“plain old JavaScript objects”。整个 JSON/BSON 事情变得过度了,“经常”(并非总是)的情况是人们只需要关心他们正在使用的语言的本机“对象”实现。或者对于大多数缺少该功能的强类型语言,驱动程序返回和支持的对象格式。在问题中看到问题并提供解决问题的方法也值得称赞。
  • @BlakesSeven 是的,在大多数情况下,开发人员永远不应该真正关心 BSON/JSON。驱动程序/库通常处理该抽象层。
  • 谢谢乔希,但我想我需要澄清一下——“添加命中值”只是作为一个非常简单的例子。我想创建一些相当复杂的服务器端功能,远远超出 MongoDB 的内置功能。我会研究其他建议。
猜你喜欢
  • 2022-08-22
  • 2012-06-09
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 2014-06-17
相关资源
最近更新 更多