如何在mongoose中进行聚合和分组

4

我有许多账户,每个账户都有一个被指定的员工。我想找到每个员工的账户数量。我如何使用mongoose(mongodb)的聚合来完成这项任务。我熟悉mongoose的其他功能,并能够使用以下代码实现。

exports.accountsOfEachEmployee = function(req, res) {
  Account.find({active:true}).exec(function(err, accounts){
    if (err || !accounts) res.status(400).send({
        message: 'could not retrieve accounts from database'
      });
    var accountsOfEachEmployee = {};
    for (var i = 0; i < accounts.length; i++) {
      if(accountsOfEachEmployee[order[i].employee]) {
        accountsOfEachEmployee[order[i].employee] = 1;
      } else {
        accountsOfEachEmployee[order[i].employee]++;
      }
    }
    res.json(accountsOfEachEmployee);
  }); 
};

使用聚合操作会更快吗?mongoose(mongodb)中的分组和聚合是如何工作的?下面是我的账户模式:

var AccountSchema = new Schema({
  active: {
    type : Boolean, 
    default: false
  },
  employee: {
    type: Schema.ObjectId,
    ref: 'Employee'
  },
});
1个回答

2

聚合是在mongodb中执行简单查询时比map reduce更快的方法。我能够完成上述查询并对mongodb进行分组、计数等操作。以下是我后来使用的查询:

Order.aggregate({$match: {active: true }}, 
  {$group: {_id:'$employee', numberOfOrders: {$sum:1}}}, function(err, orders) {
    res.json(orders);
});

查询分为两个部分。第一部分是获取所有活动结果,然后根据员工的值对它们进行分组,同时获得一个新的字段numberofOrders,该字段是在根据员工分组时形成的每个组中文档数量的数量。


看起来在Mongoose 5.x中需要一个数组。在我将聚合对象包装在[]中后,你的答案对我很有帮助。感谢你的帮助。 - user8675309

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接