2013-04-07 151 views
2

這涉及陣列字段(一個或多個)和正常字段(一個或多個)的總和是樣品收集:聚合MongoDB中

{'f1': 10, '_id': 1, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]} 
{'f1': 10, '_id': 2, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]} 
{'f1': 77, '_id': 3, 'key': 'g', 'items': [{'i1': 10}, {'i1': 10}, {'i1': 10}]} 

我要像下式:$sum(f1 + Σ[items.i1])到上述收集來計算。以下是我能想出的(在pymongo):

db.collec.aggregate([  
     { "$unwind" : "$items"}, 
    { "$group" : {  
      "_id" : {"key": "$key", "id": "$_id"},  
    "matches" : { "$sum" : "$items.i1" },  
    "extra" : { "$sum" : "$f1" },  
    "count" : {"$sum": 1}  
        }}, 
    { "$group": {  
      "_id" : "$_id.key",  
      "finalSum":{ "$sum":  
         { "$add": ["$matches", {"$divide":["$extra", "$count"]}]}}}}  
    ]); 

輸出:

{'finalSum': 187.0, '_id': 'g'} 

雖然這給正確的輸出,我希望有這個更好的,更簡單的解決方案: 任何幫助高度讚賞。

回答

3

當您對文檔進行分組時,您可以將「f1」保存到_id字段,以便您不需要對其進行彙總並對每個文檔進行分割。

聚集操作是這樣的:

db.collec.aggregate([  
    { "$unwind" : "$items"}, 
    { "$group" : {  
      _id : {key: "$key", id: "$_id", f1 : "$f1" },  
      matches : { "$sum" : "$items.i1" },  
    }}, 
    { "$group": {  
      _id : "$_id.key",  
      finalSum : { "$sum":  
         { "$add": ["$matches", "$_id.f1"]}}}}  
    ]); 
+0

感謝琳達。這似乎是一個更好的解決方案。然而,我想知道16MB的文件限制可能不允許這種情況下的大量記錄和足夠的獨特'鍵' - 'F1'組合。另外,是否有任何標準的方法呢?除了寫多個'$ group'? – ranjjose 2013-04-14 13:58:58