如何计算mongodb中2个字段的数组?

时间:2014-04-03 08:44:36

标签: php mongodb

我有一个名为posts的集合,其中包含postID,text,likes,shares字段。 Likes and shares包含 userID 的数组,他们喜欢和分享。


    {
      postID: 1,
      text: "hello world",
      likes:[ 10001,10002,1004,1006 ],
      share:[10006,10007,10001,10003]
    }
    {
      postID: 2,
      text: "Am robot",
      likes:[ 1004,1006 ],
      share:[10007,10001,10003]
    } 

我想计算帖子集合中每个文档的喜欢和分享数量。我想得到低于结果


    {
      postID: 1,
      text: "hello world",
      likes:4,
      share:4
    }
    {
      postID: 2,
      text: "Am robot",
      likes:2,
      share:2
    } 

请帮帮我。提前致谢。

1 个答案:

答案 0 :(得分:0)

两种方法,一种是聚合的:

db.collection.aggregate([
    { "$unwind": "$likes"},
    { "$group": { 
        "_id": { 
           "_id": "$_id", 
           "text": "$text", 
           "share": "$share" 
        }, 
        "likes": { "$sum": 1 } 
    }},
    { "$unwind": "$_id.share" },
    { "$group": { 
        "_id": { 
            "_id": "$_id._id",
            "text": "$_id.text", 
            "likes": "$likes" 
        }, 
        "share": { "$sum": 1} 
    }},
    { "$project": {
        "_id": "$_id._id",
        "text": "$_id.text",
        "likes": "$_id.likes",
        "share": "$share"
    }}
])

如果你不能将它作为PHP代码解决,那么将方法中的所有内容作为字符串放入变量$ result并解码JSON:

print_r( json_decode( $result ) );

或者使用mapReduce:

db.collection.mapReduce(
    function () {
        emit(
            this._id,
            {
                "text": this.text,
                "likes": this.likes.length,
                "share": this.share.length
            }
        );
     },
     function(){},
     { "out": { "inline": 1 } }
 )