1

当我这样做对我的收藏此查询...节点与猫鼬和总金额嵌套领域

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是一个REF域。如何将嵌套媒体对象(如果存在)聚合到$sumamount字段并将结果分组为project_code

+0

目前还不清楚预期的结果是什么。你能否详细说明一下? – styvane

回答

2

可以使用聚合框架,您运行聚合管道,它由最初的$unwind管道,将非规范化的media领域,因为它是一个数组,然后$lookup运营商做左连接到收集有media裁判。进一步$unwind运算符需要将连接结果产生的数组字段平滑,然后对平展文档执行运算符流水线以产生期望的结果。

运行下面的管道应为你工作:

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

谢谢!如果我可以upvote 100次,我会。代码工作的优秀解释首先尝试。 – Dave

+0

我遵循mongo的问题,我发现你在这个话题上回答了很多。你在那里工作? :) – nurgasemetey

+1

@nurgasemetey否:)刚刚对技术发展非常感兴趣,并对其他人提出的问题和技术帮助表示热烈的支持。 – chridam