2012-06-17 53 views
1

我有這種格式的mongo文檔。在mongodb中縮小地圖

{"_id" : 1,"Summary" : {...},"Examples" : [{"_id" : 353,"CategoryId" : 4},{"_id" : 239,"CategoryId" : 28}, ... ]} 
{"_id" : 2,"Summary" : {...},"Examples" : [{"_id" : 312,"CategoryId" : 2},{"_id" : 121,"CategoryId" : 12}, ... ]} 

我該如何映射/降低他們獲得如哈希:

{ [ result[categoryId] : count_of_examples , .....] } 

即每個類別的例子計數。 我有30個類別,全部在類別集合中指定。

+0

您是否必須使用map/reduce或者您是否可以升級到2.1並使用聚合框架? –

+0

當然沒有,我不必使用map/reduce。有沒有其他的方法? –

+0

如果你可以使用2.1,那麼你可以使用http://docs.mongodb.org/manual/applications/aggregation/ –

回答

1

如果你可以用2.1(即將發佈2.2的開發版本),那麼你可以使用Aggregation Framework,它會是這個樣子:

db.collection.aggregate([ 
     {$project:{"CatId":"$Examples.CategoryId","_id":0}}, 
     {$unwind:"$CatId"}, 
     {$group:{_id:"$CatId","num":{$sum:1} } }, 
     {$project:{CategoryId:"$_id",NumberOfExamples:"$num",_id:0 }} 
]); 

第一步項目爲例的子域(類別ID)成(不必要,但有助於提高可讀性),然後我們展開一系列例子,爲CatId的每個數組值創建一個單獨的文檔,我們做一個「group by」並對它們進行計數(我假定每個CategoryId就是一個例子,對嗎?)最後我們再次使用投影重新標記字段,並使結果如下所示:

"result" : [ 
    { 
     "CategoryId" : 12, 
     "NumberOfExamples" : 1 
    }, 
    { 
     "CategoryId" : 2, 
     "NumberOfExamples" : 1 
    }, 
    { 
     "CategoryId" : 28, 
     "NumberOfExamples" : 1 
    }, 
    { 
     "CategoryId" : 4, 
     "NumberOfExamples" : 1 
    } 
], 
"ok" : 1 
+0

我用你的示例文件,所以總和並沒有最終變得非常有趣... –

+0

這聽起來不錯,另一個問題是它如何在Mongoid中實現? –

+0

如果你可以做db.runCommand,那麼你可以使用它:db.runCommand({「aggregate」:「collectionName」,「pipeline」:[]})http://docs.mongodb.org/manual/reference/commands /#骨料 –