19

我已经在 shell 中构建了我想要的查询,但是在 Mongoose 中编写它时遇到了麻烦。

db.commentstreams.group({ key: { page_id: true }, reduce: function(obj,prev) { prev.num_comments += obj.num_comments }, initial: { num_comments: 0 } })

我对 Mongoose 语法有点困惑;也许有人可以对此有所了解。非常感谢。

4

4 回答 4

15

根据这篇文章

Model.find({}, [fields], {'group': 'FIELD'}, function(err, logs) { 
        ... 
}); 

不幸的是,我们似乎缺乏这方面的文档。

于 2011-09-27T13:37:36.143 回答
13

MapReduce 应该是正确的方法,但是如果您不进行分片并且您的查询不会导致超过 10k 条记录,则可以。

你可以通过 moongoose 访问任何 node-mongodb-native 函数,所以它看起来像这样:

var group = {
   key: {},
   cond: {item_id: item_id},
   reduce: function(doc, out) {
      out.count++;
      out.total += doc.value;
   },
   initial: {
       total: 0,
       count: 0
   },
   finalize: function(out) {
       out.avg = out.total / out.count;
   }
};

Item.collection.group(group.key, group.cond, group.initial, group.reduce, group.finalize, true, function(err, results) {
    console.log('group results %j', results);
});

node-mongodb-native 来源: https ://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js#L1165

MongoDB 组文档: http ://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group

于 2012-05-12T00:17:37.500 回答
0

我使用了类似的示例,希望对您有所帮助

Register.aggregate(
[
  {
   $group: {_id: {campaign: "$campaign"}, quantity: {$sum: 1}}
},
  {
    $limit: 5
  },
  {
    $sort: {date: -1}
  }
], function (err, res) {
        console.log(res)
});
于 2019-09-19T05:25:09.417 回答
0

如果您尝试使用 Mongoose 进行分组,也许您最好 在 node.js / express route 中查看这个 Mongoose 组查询

Mongoose 似乎不支持 group ,而聚合则支持。

于 2016-07-17T08:22:07.947 回答