分组依据 node.js-mongodb

Group by in node.js-mongodb

我想在我的 server.js 中使用分组依据,但我收到此错误:

TypeError:Object #(Collection) has no method 'group'

我在网上查了一下,发现那是函数的名称。

这是我写的:

var monk = require('monk');
var db = monk('localhost:27017/Messages');
var collection = db.get('col');
collection.group(['a'], {}, {}, {}, function (e, docs) {
  res.json(docs);
});

谁能告诉我怎么了? 谢谢!

如错误消息所述,Collection 对象似乎没有 group() 作为方法。 Here is the source of what you're dealing with

看起来像 someone else has had an issue with this in the past.

我对使用 monk 了解不多(抱歉),但看起来它非常受 promise 驱动,因此复制粘贴 RomanGorbatko 的解决方案可能就是您所需要的。

Monk 不从底层驱动程序实现 .group() method on it's own, but there is a .col accessor available from which you can get the native Collection 对象并使用它的方法。

您对 .group() 的用法有点不对,所以我将使用我的数据作为示例:

{
    "_id" : ObjectId("5479c4793815a1f417f537a0"),
    "status" : "canceled",
    "date" : ISODate("2014-11-29T00:00:00.000Z"),
    "offset" : 30,
},
{
    "_id" : ObjectId("5479c4793815a1f417d557a0"),
    "status" : "done",
    "date" : ISODate("2014-10-20T00:00:00.000Z"),
    "offset" : 30,
},
{
    "_id" : ObjectId("5479c4793815a1f417f117a0"),
    "status" : "done",
    "date" : ISODate("2014-12-29T00:00:00.000Z"),
    "offset" : 30,
}

然后您可以像这样编写一个 .group() 语句:

  var db = require('monk')('localhost/test'),
      sample = db.get('sample');

  sample.col.group(
    ["status"],
    {},
    { "count": 0 },
    "function (obj,prev) { prev.count++; }",
    function(err,docs) {
      if (err) console.log(err);
      console.log( docs );
    }
  );

但这也表明 99% 的时间您可能真的想要 .aggregate() 方法:

  var db = require('monk')('localhost/test'),
      sample = db.get('sample');

  sample.col.aggregate(
      [
          { "$group": {
              "_id": "$sample",
              "count": { "$sum": 1 }
          }}
      ],
      function(err,docs) {
         if (err) console.log(err);
         console.log( docs );
      }
  );

聚合框架通常比 .group() 灵活得多,并且运行本机代码运算符而不是解释 JavaScript,因此非常值得学习。