2013-07-15 92 views
3

我在MongoDB中使用db.collection.aggregate時遇到了問題。如何累計MongoDB的子文檔中的每個字段?

我有這樣的數據結構:

_id:... 

Segment:{ 
    "S1":1, 
    "S2":5, 
    ... 
    "Sn":10 
} 

這意味着在Segment如下:我可能有一個數值幾個子屬性。我想總結他們爲1 + 5 + .. + 10

問題是:我不確定子屬性名稱,因爲每個文檔的段號是不同的。所以我不能列出每個細分名稱。我只是想使用類似於for循環將所有值彙總在一起。

我試着像查詢:

db.collection.aggregate([ 

    {$group:{ 
    _id:"$Account", 

    total:{$sum:"$Segment.$"} 
]) 

,但它不工作。

+0

你需要改變你的模式是類似'段:5,值:400'並把它們放在一個陣列,或使用一個MapReduce。你無法對任意字段進行求和。 – WiredPrairie

回答

13

你犯了古典錯誤,有任意的字段名稱。 MongoDB是「無模式」的,但這並不意味着你不需要考慮自己的模式。鍵名應該是描述性的,在你的情況下,f.e. 「S2」並不意味着什麼。爲了做到種類最多的查詢和操作,你就需要重新設計你的架構來存儲這樣的數據:

_id:... 
Segment:[ 
    { field: "S1", value: 1 }, 
    { field: "S2", value: 5 }, 
    { field: "Sn", value: 10 }, 
] 

然後,您可以運行查詢,如:

db.collection.aggregate([ 
    { $unwind: "$Segment" }, 
    { $group: { 
     _id: '$_id', 
     sum: { $sum: '$Segment.value' } 
    } } 
]); 

然後結果弄成這個樣子(與唯一文件從你的問題):

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("51e4772e13573be11ac2ca6f"), 
      "sum" : 16 
     } 
    ], 
    "ok" : 1 
} 
+0

謝謝。我想你是對的。但問題是我已經加載了相當大的整個數據集..有什麼方法可以進行轉換嗎? – aaintw

+0

我不這麼認爲。你將不得不編寫一個腳本來逐一完成。如果這個腳本已經在生產中運行,請確保你節制腳本。 – Derick

+0

謝謝!在Mongo中還有很多東西要學.. – aaintw

相關問題