开发者

Executing MongoDB query in Node.js

I am trying to execute this MongoDB command in 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
  }
})

This works great from the Mongo command like giving me summaries by day. When I try this in 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) {
    sum开发者_StackOverflow中文版maries.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)
  });
});

I get a single result with all the totals per day summed up together, so basically a sum of count, empty, redos for the entire period.

What is being done wrong in trying to convert the query to use in Node.js?


I had the same problem. I delved quite a bit through the mongodb driver code.

The problem is keys from sub documents. the driver ends up with something like

obj["timestamp.d"]

which is not what you want.

What I found is a 'command' argument that solved my problem.

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) }
  );
})

You can see it here: collection.js from line 1054 on


I find it's difficult to to refer to Docs API. So I find some, and there they are:

Here is docs in MongoDB.

and Here is some more.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜