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