Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Node.js中执行MongoDB查询_Mongodb_Node.js - Fatal编程技术网

在Node.js中执行MongoDB查询

在Node.js中执行MongoDB查询,mongodb,node.js,Mongodb,Node.js,我试图在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++;

我试图在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
  }
})
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)
  });
});
这在Mongo命令中非常有效,比如每天给我总结。在Node.js中尝试此操作时:

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
  }
})
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中使用时出错了什么?

我也遇到了同样的问题。我深入研究了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) }
  );
})
你可以在这里看到:

上的第1054行,我发现很难参考Docs API。所以我找到了一些,它们是:

医生在吗


还有更多。

我可能已经解决了这个问题,Node运行查询的方式与命令行不同,因此分组不是按
timestamp
的hash元素
d
分组,而是按
timestamp.d
分组,我可能只是改进了一下-它本身不是Node.js,而是Node mongodb本机驱动程序()。您可以通过浏览代码来查看驱动程序到底是如何实现该操作的。