我有一个名为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 }
请帮帮我。提前致谢。
答案 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 } }
)