2013-07-23 144 views
1

我使用下面的架構從MongoDB的FAQ如何使用聚合框架將動態屬性中的mongo db分組?

{ 
    attrib : [ 
     { k: "color", v: "red" }, 
     { k: "shape", v: "rectangle" }, 
     { k: "color", v: "blue" }, 
     { k: "avail", v: true } 
     ] 
} 

我怎樣才能組和例如計數集合通過「顏色」?如果可能的話,我寧願使用聚合框架而不使用map reduce。

我的結果應該是這樣的:

[ 
    { 
     v: "blue", 
     count: 5 
    }, 
    { 
     v: "red", 
     count: 2 
    }, 
    { 
     v: "black", 
     count: 52 
    } 
] 
+0

你能多一點點的描述對哪些文件你有作爲輸入和你期望的輸出? – Derick

+0

如果您只想計算文檔,請嘗試使用'.find({「attrib.k」:「color」})。count()'。如果你想要更復雜的文件內的發生次數,請提供更多信息,如預期輸出:) – randunel

+0

我剛剛添加了我的預期輸出。 – joafeldmann

回答

2

這是相當瑣碎的,我們需要做一個放鬆身心的比賽,然後一組由:

db.so.aggregate([ 
    { $unwind : '$attrib' }, 
    { $match: { 'attrib.k' : 'color' } }, 
    { $group: { _id: '$attrib.v', count: { '$sum': 1 } } } 
]); 

開卷炸燬「 attrib「數組合成一個文件:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "red" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "shape", 
       "v" : "rectangle" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "blue" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "avail", 
       "v" : true 
      } 
     } 
    ], 
    "ok" : 1 
} 

匹配然後刪除所有非顏色項目:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "red" 
      } 
     }, 
     { 
      "_id" : ObjectId("51eeb9f2812db9ff4412f132"), 
      "attrib" : { 
       "k" : "color", 
       "v" : "blue" 
      } 
     } 
    ], 
    "ok" : 1 
} 

和集團最終使得其返回:

{ 
    "result" : [ 
     { 
      "_id" : "blue", 
      "count" : 1 
     }, 
     { 
      "_id" : "red", 
      "count" : 1 
     } 
    ], 
    "ok" : 1 
} 

(以上所有輸出是剛剛從你單樣本文檔)

+0

謝謝!你認爲,使用聚合框架比使用map/reduce更好/更快嗎? – joafeldmann

+0

是的,因爲它不會以這種方式進入JavaScript。 – Derick

+0

還有一個問題:如何包含/組合對象,其中color屬性根本不存在? – joafeldmann

相關問題