3

次のコンテンツを含むコレクションがあります。

{
    "_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、category、"いいねの数"

どういうわけか、適切な解決策が見つかりません...これまでに得たのは、好きなカテゴリの合計ですが、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
});

誰かが私にヒントを与えることができますか?ヘルプは大歓迎です!

トビ

4

2 に答える 2

2

MR を使用して各ユーザーのいいねをカウントしたい場合は、reduce でドキュメントをグループ化するために使用されるキーとして user_id と category を発行できます。

map: function() {
    var u = this.user_id; 
    this.likes.data.forEach(
       function(z){
            emit( {category: z.category, user: u} , { count : 1 } );
        }
    );
}
于 2012-09-14T22:29:56.310 に答える
1

可能であれば、最新の安定リリースである MongoDB バージョン 2.2 に付属する新しい集計フレームワークを使用することをお勧めします。集計フレームワークは Javascript ではなく C++ で記述されており、多くの集計コマンドのパフォーマンスが向上するはずです。

次の 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
}
于 2012-09-14T21:44:44.743 に答える