2016-08-19 4 views
2

MongoDBの中で様々なユーザーが作成した投稿数カウントする:同様に書き込みMapReduceの機能は、私がようにMongoDBにタイトル、説明、によって、コメントをコレクション「投稿」を作成していた

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

を、私は、他の2つを追加しましたエントリ。 ここで、MongoDBのさまざまなユーザーによって作成された投稿の数をカウントするMapReduce関数を書きたいと思っています。私が使用:

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

最後に解決します。私は(これ。のuser_id、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() 

からいくつかのアイデアを持ちました。私は間違った鍵を渡していた。

0

再書き込みがあなたのmapReduceメソッド:

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

または出力コレクションオプションでのMapReduce処理を実行するために、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 ":ヌル、 "値":3}] が働きません。 –

+0

@SarojShresthaなぜインライン出力にfind()を追加していますか?検索せず – chridam

+0

()出力 "結果":[ { "ID":ヌル、 "値":3 } ] "timeMillis":15、 "カウント":{ "入力":3、 "EMIT":3、 は "減らす":3、 "出力":1 }、 "OK":1 } –

関連する問題