在 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 本机驱动程序记录所有查询

Node.js mongodb 驱动程序异步/等待查询

带有 Node Js 的 Mongodb

Node.js - Http get 不会在 Postman 或浏览器中显示来自 MongoDb 查询的数据

从Node JS中的MongoDB查询中获取数据