【问题标题】:Executing MongoDB query in Node.js在 Node.js 中执行 MongoDB 查询
【发布时间】: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)。您可以通过浏览代码来查看驱动程序是如何实现该操作的。

标签: mongodb node.js


【解决方案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。所以我找到了一些,它们就是:

    HereMongoDB 中的文档。

    还有Here 更多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多