在 Node.js 中执行 MongoDB 查询
Posted
技术标签:
【中文标题】在 Node.js 中执行 MongoDB 查询【英文标题】:Executing MongoDB query in Node.js 【发布时间】:2011-03-26 14:07:42 【问题描述】:我正在尝试在 Node.js 中执行这个 MongoDB 命令:
db.events.group(
key:
'timestamp.d': true
,
cond:
'event_name': 'search'
,
initial:
'count': 0,
'empty': 0,
'redos': 0
,
reduce: function(item, summaries)
summaries.count++;
if (item.result_count == 0)
summaries.empty++;
if (item.original_query)
summaries.redos++;
var totalSuccesses = (summaries.count - summaries.redos - summaries.empty);
summaries.percentNonFailures = (totalSuccesses / summaries.count) * 100
)
这在 Mongo 命令中非常有用,就像每天给我总结一样。当我在 Node.js 中尝试这个时:
db.collection('events', function(err, collection)
collection.group(
"timestamp.d": true
,
"event_name": "search"
,
count: 0,
empty: 0,
redos: 0,
percentNonFailure: 0,
, function(item, summaries)
summaries.count++;
if (item.result_count == 0)
summaries.empty++;
if (item.original_query)
summaries.redos++;
totalSuccesses = summaries.count - summaries.redos - summaries.empty
summaries.percentNonFailure = (totalSuccesses / summaries.count) * 100
, function(err, results)
self.eventEmitter.emit(doneEvent, results)
);
);
我得到一个结果,将每天的所有总数加在一起,所以基本上是整个期间的计数、空、重做的总和。
在尝试将查询转换为在 Node.js 中使用时做错了什么?
【问题讨论】:
我可能已经解决了这个问题,Node 运行查询的方式与命令行不同,所以分组不是按timestamp
的哈希元素 d
分组,而是按 timestamp.d
分组跨度>
我可以改进一下——它本身不是 node.js,而是 node-mongodb-native 驱动程序(github.com/christkv/node-mongodb-native)。您可以通过浏览代码来查看驱动程序是如何实现该操作的。
【参考方案1】:
我遇到了同样的问题。我深入研究了mongodb驱动代码。
问题是来自子文档的键。驱动程序最终得到类似
obj["timestamp.d"]
这不是你想要的。
我发现一个“命令”参数解决了我的问题。
db.collection('events', function(err, collection)
collection.group(
[ "timestamp.d" ], // array element, might also work the old way
"event_name": "search" ,
count: 0,
empty: 0,
redos: 0,
percentNonFailure: 0,
,
function(item, summaries)
summaries.count++;
if (item.result_count == 0) summaries.empty++;
if (item.original_query) summaries.redos++;
totalSuccesses = summaries.count - summaries.redos - summaries.empty
summaries.percentNonFailure = (totalSuccesses / summaries.count) * 100
,
true, // use the group command
function(err, results) self.eventEmitter.emit(doneEvent, results)
);
)
你可以在这里看到它: collection.js 从第 1054 行开始
【讨论】:
【参考方案2】:我发现很难参考 Docs API。所以我找到了一些,它们就是:
Here 是MongoDB 中的文档。
还有Here 更多。
【讨论】:
以上是关于在 Node.js 中执行 MongoDB 查询的主要内容,如果未能解决你的问题,请参考以下文章
带有承诺的 MongoDB 查询不执行 if 语句(MongoDB node.js 驱动程序)
使用适用于 Node JS 的 mongodb 本机驱动程序记录所有查询