编写MapReduce函数来计算MongoDB中各种用户创建的帖子数量

时间:2016-08-19 03:26:10

标签: mongodb mapreduce nosql

我创建了一个集合"帖子"与MongoDB中的标题,描述,依据,评论:

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 }

2 个答案:

答案 0 :(得分:2)

最后,我解决了。我从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)。我错了钥匙。

答案 1 :(得分:0)

将mapReduce方法重写为:

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

或使用runCommand命令运行带有输出集合选项的mapReduce操作:

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 }
        }
    }
])