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

Php 如何计算mongodb中2个字段的数组计数?,php,mongodb,Php,Mongodb,我有一个名为posts的集合,其中有posted、text、likes和shares字段喜欢和共享包含喜欢和共享的用户ID的数组 { postID: 1, text: "hello world", likes:[ 10001,10002,1004,1006 ], share:[10006,10007,10001,10003] } { postID: 2, text: "Am robot", lik

我有一个名为posts的集合,其中有posted、text、likes和shares字段喜欢和共享包含喜欢和共享的用户ID的数组

{ 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] } { 职位:1,, 文字:“你好,世界”, 喜欢:[100011000210041006], 股份:[10006100071000110003] } { 职位:2,, 文字:“我是机器人”, 喜欢:[10041006], 股份:[100071000110003] } 我想计算posts集合中每个文档的喜欢和共享的数量。我想得到下面的结果

{ postID: 1, text: "hello world", likes:4, share:4 } { postID: 2, text: "Am robot", likes:2, share:2 } { 职位:1,, 文字:“你好,世界”, 喜欢:4, 份额:4 } { 职位:2,, 文字:“我是机器人”, 喜欢:2,, 份额:2 }
请帮帮我。提前谢谢

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

db.collection.aggregate([
{“$REWIND”:“$likes”},
{“$group”:{
“_id”:{
“\u id”:“$\u id”,
“文本”:“$text”,
“股份”:“$share”
}, 
“喜欢”:{“$sum”:1}
}},
{“$unwind”:“$\u id.share”},
{“$group”:{
“_id”:{
“\u id”:“$\u id.\u id”,
“文本”:“$\u id.text”,
“likes”:“$likes”
}, 
“股份”:{“$sum”:1}
}},
{“$project”:{
“\u id”:“$\u id.\u id”,
“文本”:“$\u id.text”,
“喜欢”:“$\u id.likes”,
“股份”:“$share”
}}
])
如果无法将其作为PHP代码进行计算,则将方法中的所有内容作为字符串放入变量$result中,并解码JSON:

print_r(json_decode($result));
或者使用mapReduce执行此操作:

db.collection.mapReduce(
函数(){
散发(
这个,
{
“文本”:这个文本,
“喜欢”:this.likes.length,
“share”:this.share.length
}
);
},
函数(){},
{“out”:{“inline”:1}
)

你是如何查询你的服务器的?你是否已经检查过这一点:我会标记为重复,但还没有投票结果:我不知道如何计算它。但是我们不能使用count,count是用来计算集合中文档的数量,而不是文档中的数组。@Neil Lunn这对我没有帮助。.你使用什么框架??或者使用js??我可以用PHP解决这个问题,这不是问题,但我想在MongoDb中找到解决方案,所以我发布了这个问题。我会试试这个代码,它成功了。但问题是,如果字段共享字段不存在于所有文档中,它会抛出错误。没有拼写错误。但是,如果共享字段没有出现在所有文档中,它将抛出一个错误,即无法读取'this.share.length'@vinothkumar'附近未定义的'length'属性,这就是为什么存在“mapReduce”选项的原因。如果您有特殊情况,比如缺少字段,那么您可以通过测试是否存在并输入默认值来对其进行编码。缺少字段不是您问题中所述的条件。这并不难。我是mongodb的新手,所以我对mongodb没有太多的了解。这就是我问这样一个问题的原因。不管怎样,我得到了一个火花,我要和它一起生火。谢谢你的帮助。