2016-08-19 98 views
2

我創造了一個集「的帖子」有標題,描述,通過評論MongoDB中的各個用戶在MongoDB中創造的職位數目:寫MapReduce的函數來計算

db.posts.insert({ 
        title:'MongoDB', 
        description:'MongoDB is a NoSQL DB', 
        by:'Tom', 
        comments:[ 
          {user:'ram', 
           message:'We use MongoDB' 
          } 
          ] 
       } 
       ) 

同樣,我添加了另外兩個條目。 現在,我想寫MapReduce函數來統計MongoDB中各種用戶創建的帖子數。我用:

db.posts.mapReduce( 
    function() { emit(this.user_id,1); }, 
    function(key, values) {return Array.sum(values)}, {  
     out:"post_total" 
    } 

).find() 

輸出:

{"id": null , "value": 3} 

但是,我想顯示是這樣的:

{ "_id" : "tom_id", "value" : 2 } 
{ "_id" : "mark_id", "value" : 1 } 

{ "by" : "tom", "value" : 2 } 
{ "by" : "mark", "value" : 1 } 

回答

1

最後,我解決了它。我有一些想法來自MapReduce function in MongoDB - Grouping document by ID

db.posts.mapReduce( 
    function() { emit(this.by,1); }, 
    function(key, values) {return Array.sum(values)}, {  
     out:"post_total" 
    } 

).find() 

我做錯了什麼是放出(這一點。user_id說明,1)。我傳錯了鑰匙。

0

重新寫你的mapReduce方法爲:

db.posts.mapReduce(
    function() { 
     emit(this.user_id, 1); 
    }, 
    function(key, values) { 
     return Array.sum(values); 
    }, 
    { "out": { "inline": 1 } } 
) 

或使用RunCommand命令與輸出收集選項運行一個精簡操作:

mr = db.runCommand({ 
    "mapreduce": "posts", 
    "map" : function() { 
     for (var key in this) { emit(this.user_id, 1); } 
    }, 
    "reduce" : function(key, values) { return Array.sum(values); }, 
    "out": "post_total" 
}) 

要得到的結果,對結果集合運行find()

db[mr.result].find() 

使用聚合框架的等效結果仍然更有效率操作:

db.posts.aggregate([ 
    { 
     "$group": { 
      "_id": "$user_id", 
      "count": { "$sum": 1 } 
     } 
    } 
]) 
+0

db.posts.mapReduce( 函數(){ EMIT(this.user_id,1);} , 功能(鍵,值){ 返回Array.sum(值); },{ 「出 「:{ 」內聯「:1}} ).find() 輸出: [{」 ID「:NULL, 」值「:3}] 不工作。 –

+0

@SarojShrestha爲什麼要將find()添加到內聯輸出中? – chridam

+0

沒有查找()輸出 「結果」:[ { 「ID」:空, 「值」:3 } ] 「timeMillis」:15, 「計數」:{ 「輸入」:3, 「EMIT」:3, 「減少」:3, 「輸出」:1 }, 「OK」:1 } –