我有一个集合,让我们说以下内容:
{
"_id":ObjectId("5051c4778ec2487f7c000001"),
"user_id":"978956784678",
"likes":{
"data":[
{
"name":"Store 1",
"category":"Retail and consumer merchandise",
"id":"354412263434",
"created_time":"2012-09-07T11:36:05+0000"
},
{
"name":"Store 2",
"category":"Retail and consumer merchandise",
"id":"293088074081904",
"created_time":"2012-08-13T20:06:49+0000"
}
],
"paging":{
"next":"https://test.com/next"
}
}
}
我正在尝试在MongoDB中构建Map / Reduce或聚合,以便给出以下输出(示意图):
user_id,类别,“喜欢的数量”
不知怎的,我找不到合适的解决方案......到目前为止我得到的是类别喜欢的总聚合,但不是每个user_id:
db.runCommand({
mapreduce: "likes",
map: function() {
this.likes.data.forEach(
function(z){
emit( z.category , { count : 1 } );
}
);
},
reduce: function(key, values) {
var total = 0;
for ( var i=0; i<values.length; i++ )
total += values[i].count;
return { count : total };
},
out: 'result3',
verbose: true
});
有人可以给我一个提示吗?非常感谢帮助!
托比
答案 0 :(得分:2)
如果您想使用MR来计算每个用户的喜好,您可以发出user_id和category作为用于在reduce中分组文档的密钥:
map: function() {
var u = this.user_id;
this.likes.data.forEach(
function(z){
emit( {category: z.category, user: u} , { count : 1 } );
}
);
}
答案 1 :(得分:1)
如果可能的话,我建议使用新的聚合框架,它是MongoDB 2.2版本的最新版本。聚合框架是用C ++而不是Javascript编写的,并且对于许多聚合命令应该具有更好的性能。
以下aggregate()计算每个用户每个类别的匹配数。如果这不是所需的输出,请告诉我。
命令:
db.collection.aggregate(
{ $unwind : "$likes.data" },
{ $group :
{
_id: {user: "$user_id", category: "$likes.data.category"},
count: {$sum:1}
}
}
);
结果:
{
"result" : [
{
"_id" : {
"user" : "978956784678",
"category" : "Retail and consumer merchandise"
},
"count" : 2
}
],
"ok" : 1
}