2016-02-09 58 views
1

這是我的問題。我在網站上查了很多其他的MongoDB問題,但沒有一個符合我的情況。MongoDB - 聚合組合和2個層次的aub-array和subdocument

我有一個MongoDB的嵌入文檔結構,看起來像這樣: -

{ 
    company : "ABC", 
    year : 2010, 
    Project : [{ 
      Domain : "Telecom", 
      Client: [{"Name": "Ponderfone","size":25},{"Name": "Skytel","size":35},{"Name": "ChinaTel","size":10}] 
     }, { 
      Domain : "Retail", 
      Client: [{"Name": "Gatemart","size":95},{"Name": "Clearway","size":40}]   
     }, { 
      Domain : "Finance", 
      Client: [{"Name": "MFCI","size":20},{"Name": "FCCI","size":20},{"Name": "MobiBank","size":35}]    
     } 
    ] 
} 
{ 
    company : "ABC", 
    year : 2011, 
    Project : [{ 
      Domain : "Telecom", 
      Client: [{"Name": "Ponderfone","size":50},{"Name": "Skytel","size":30},{"Name": "ChinaWay","size":30}] 
     }, { 
      Domain : "Retail", 
      Client: [{"Name": "Gatemart","size":120},{"Name": "Shadowfax","size":15}]   
     }, { 
      Domain : "Finance", 
      Client: [{"Name": "Reuben Analysts","size":15},{"Name": "FCCI","size":10},{"Name": "MobiBank","size":35}]    
     } 
    ] 
} 

這裏的問題是,我想最裏面的文件,這是嵌入到2級的聚集列: - 「Project.Client.Size」

我試圖總結此列特定域(如果你看到的JSON)

db.projects.aggregate(
{ $match: {"year" : 2010,"company" :"ABC"}}, 
{ $unwind: "$Project" }, 
{ $match: { $or: [{"Project.Domain" : /Telecom/},{"Project.Domain" :/Retail/}]}}, 
{ $group: { "_id": {company: "$company", year: "$year", domain: "$Project.Domain"}, 
headcount: { "$sum":" $Project.Client.size" }} 
}) 

親與此代碼blem是它返回與標記爲0人頭結果

{ "_id" : { "company" : "ABC", "year" : 2010, "domain" : "Retail" }, "headcount" 
: 0 } 
{ "_id" : { "company" : "ABC", "year" : 2010, "domain" : "Telecom" }, "headcount 
" : 0 } 

總人數應爲(25 + 35 + 10),用於電信,2010年和公司ABC 總人數應爲70(95 +40)135零售,2010年和公司ABC

有什麼我在這裏失蹤?

回答

1

你缺少在管道中的最後$match過濾後$unwind管道的一步。這對於非規格化Client陣列非常必要,以便您可以訪問其屬性以在下一個管道中進行聚合。因此,最終的管道應遵循此模式:


db.projects.aggregate([ 
    { "$match": {"year": 2010, "company": "ABC"} }, 
    { "$unwind": "$Project" }, 
    { "$match": { "$or": [{"Project.Domain": /Telecom/},{"Project.Domain": /Retail/}] } }, 
    { "$unwind": "$Project.Client" }, 
    { 
     "$group": { 
      "_id": { 
       "company": "$company", 
       "year": "$year", 
       "domain": "$Project.Domain" 
      }, 
      "headcount": { "$sum": "$Project.Client.size" } 
     } 
    } 
]) 
+1

完美..由於一噸..我會採取億萬推測這一個! – Mario