具有mongoose聚合和求和嵌套字段的节点

时间:2016-10-04 13:43:14

标签: node.js mongodb mongoose aggregation-framework mongodb-aggregation

当我对我的收藏品进行此查询时......

models.Project.find(function(err, result) {
    //result = doc below
}).populate('media')

...我得到了这个结果:

{ 
  _id: 57f36baa6cf34d079c8474a0,
  code: 'ZMIA',
  __v: 0,
  media:[
    { 
      _id: 57f36bb26cf34d079c847766,
      project_code: 'ZMIA',
      amount: 228,
      __v: 0 
    },
    { 
      _id: 57f36bb26cf34d079c84775c,
      project_code: 'ZMIA',
      amount: 250,
      __v: 0 
    } 
  ]
},
{ 
  _id: 57f36baa6cf34d079c8474a1,
  code: 'ZMJU',
  __v: 0,
  media: [] 
}

media是一个参考字段。如何将嵌套媒体对象(如果存在)聚合到$sum amount字段,并按project_code对结果进行分组?

1 个答案:

答案 0 :(得分:3)

您可以使用汇总框架运行聚合管道,该管道由初始 $unwind 管道组成,该管道将对media字段进行非规范化,因为它是一个数组,然后一个 $lookup 运算符,用于对具有media引用的集合执行左连接。需要进一步 $unwind 运算符来展平由于连接而生成的数组字段,然后在展平时执行 $group 运算符管道产生预期结果的文件。

运行以下管道应该适合您:

models.Project.aggregate([
    { "$unwind": "$media" },
    {
        "$lookup": {
            "from": "media", // <-- collection to join
            "localField": "media",
            "foreignField": "_id",
            "as": "media_joined"
        }
    },
    { "$unwind": "$media_joined" },
    {
        "$group": {
            "_id": "$media_joined.project_code",
            "total": { "$sum": "$media_joined.amount" }
        }
    }
], function(err, result){
    console.log(result);
})