MongoDB中的Map / Reduce任务:嵌套对象的聚合

时间:2012-09-14 10:35:23

标签: json mongodb mapreduce

我有一个集合,让我们说以下内容:

{
    "_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
});

有人可以给我一个提示吗?非常感谢帮助!

托比

2 个答案:

答案 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
}