节点与mongoose聚合和总和嵌套字段

当我对我的集合进行查询时

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分组?

您可以使用运行聚合stream水线的聚合框架,该聚合stream水线由一个初始的$unwindstream水线组成,该stream水线将非规范化media字段,因为它是一个数组,然后是一个$lookup操作符对具有media参考的集合执行左连接。 需要另一个$unwind操作符来平铺由于连接而产生的数组字段,然后在展开的文档上执行$group操作符pipe道以产生期望的结果。

运行下面的pipe道应该适合你:

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