2015-06-03 198 views
1

我有這兩個MongoDB文檔。我想找到真正的和巴薩的體育場館的容量,假設皇馬有兩個場館(對不起皇馬:)嵌入文檔數組 - MongoDB

{ 
     "_id" : "Bar.43", 
     "official_name" : "Futbol Club Barcelona 
     "country" : "Spain", 
     "started_by" : { 
       "day" : 28, 
       "month" : 11, 
       "year" : 1899 
     }, 
     "stadium" : { 
       "name" : "Camp Nou", 
       "capacity" : 99354 
     }, 
     "palmarès" : { 
       "La Liga" : 23, 
       "Copa del Rey" : 27, 
       "Supercopa de Espana" : 11, 
       "UEFA Champions League" : 4, 
       "UEFA Cup Winners Cup" : 4, 
       "UEFA Super Cup" : 4, 
       "FIFA Club World cup" : 2 
     }, 
     "uniform" : "blue and dark red" 
}, 

{ 
     "_id" : "RMa.103", 
     "official_name" : "Real Madrid Club de Fùtbol 
     "country" : "Spain", 
     "started_by" : { 
       "day" : 6, 
       "month" : 3, 
       "year" : 1902 
     }, 
     "stadium" : [{ 
       "name" : "Santiago Bernabeu", 
       "capacity" : 85454 
     }, 
        { 
       "name" : "Vicente Calderon" 
       "capacity" : 54907 
     }], 
     "palmarès" : { 
       "La Liga" : 32, 
       "Copa del Rey" : 19, 
       "Supercopa de Espana" : 9, 
       "UEFA Champions League" : 10, 
       "UEFA Europa League" : 2, 
       "UEFA Super Cup" : 2, 
       "FIFA Club World cup" : 4 
     }, 
     "uniform" : "white" 
} 

好,我的查詢是:

db.team.aggregate([{$group:{_id:"$country", capacityStadium:{$sum:"$stadium.capacity"}}}]) 

但它不工作。如果皇家馬德里只有一個體育場,相反,我的查詢工作。所以,一般來說,當我有一個嵌入式文檔數組,並且我想要使用聚合時,我必須使用$ unwind來劃分該數組的文檔嗎? 問題是巴塞羅那的場地球場不是一組文件,而且查詢出現錯誤。

回答

0

您可能需要更改文檔結構,因爲stadium字段應該是每個文檔中的for數組。要做到這一點,你需要找到的文件,其中球場不是一個數組,並使用「批量」操作的最大效率

var bulk = db.team.initializeOrderedBulkOp(); 
var count = 0; 
db.team.find({ "stadium.0": { "$exists": false }}).forEach(function(doc) { 
    bulk.find({ "_id": doc._id }) 
     .updateOne({ "$set": { "stadium": [doc.stadium] }}); 
    count++; 
    if(count % 100 == 0) {  
    bulk.execute();  
    bulk = db.team.initializeOrderedBulkOp(); } }) 

if(count % 100 > 0) { 
    bulk.execute(); 
} 

現在使用聚合框架對其進行更新。

db.team.aggregate(
    [ 
     { "$project": { "stadium.capacity": 1 }}, 
     { "$unwind": "$stadium" }, 
     { "$group": { "_id": "$_id", "totalCapacity": { "$sum": "$stadium.capacity" }}} 
    ] 
) 

將返回:

{ "_id" : "RMa.103", "totalCapacity" : 140361 } 
{ "_id" : "Bar.43", "totalCapacity" : 99354 }