我创建了一个集合"帖子"与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 }
答案 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 }
}
}
])