1

我想在 server.js 中使用 group by,但出现此错误:

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

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

4

2 回答 2

5

Monk 不自己实现.group()方法,但是有一个.col可用的访问器,您可以从中获取来自底层驱动程序的本机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 灵活得多,并且运行本机代码运算符,因此非常值得学习。

于 2015-01-19T06:15:15.090 回答
0

就像错误消息说的那样,Collection对象似乎没有group()作为方法。这是您正在处理的内容的来源

看起来其他人过去曾对此有过疑问。

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

于 2015-01-18T19:39:25.407 回答