完成一些聚合魔法后,我有以下数据集:
{ "_id" : "5700edfe03fcdb000347bebb", "comment" : { "commentor" : "56f3f70d4de8c74a69d1d5e1", "id" : ObjectId("570175e6c002e46edb922aa1")}, "max" : ObjectId("570175e6c002e46edb922aa3")}
{ "_id" : "5700edfe03fcdb000347bebb", "comment" : { "commentor" : "56f3f70d4de8c74a69d1d5e6", "id" : ObjectId("570175e6c002e46edb922aa2")}, "max" : ObjectId("570175e6c002e46edb922aa3")}
{ "_id" : "5700edfe03fcdb000347bebb", "comment" : { "commentor" : "56f3f70d4de8c74a69d1d5e1", "id" : ObjectId("570175e6c002e46edb922aa3")}, "max" : ObjectId("570175e6c002e46edb922aa3")}
_id代表一个帖子,在帖子中有评论。在这种情况下,有3条评论; 2由相同的评论员("56f3f70d4de8c74a69d1d5e1"
)和一个又一个评论员("56f3f70d4de8c74a69d1d5e6"
)。
我想编写一个聚合查询,只能通过评论员("56f3f70d4de8c74a69d1d5e1"
)统计所有唯一评论,并返回评论员在帖子"5700edfe03fcdb000347bebb"
上评论两次。
我尝试了以下内容:
{ "$group" : { "_id" : "$_id", "count" : { "$sum" : "$comment.commentor" } } }
结果是:
{ "_id" : "5700edfe03fcdb000347bebb", "count" : 0 }
请注意,我并未尝试将该帖子中所有评论员的评论计算为所有,因此我并未尝试这样做:
{ "$group" : { "_id" : "$_id", "count" : { "$sum" : 1 } } }
会导致:
{ "_id" : "5700edfe03fcdb000347bebb", "count" : 3 }
我只想要按用户发布的计数("56f3f70d4de8c74a69d1d5e1"
)
修改
经过一些研究,我发现$ sum仅适用于数字字段,而不适用于非数字字段:https://docs.mongodb.com/manual/reference/operator/aggregation/sum/#grp._S_sum
我可以通过任何方式"56f3f70d4de8c74a69d1d5e1"
获取用户发布的评论数量("5700edfe03fcdb000347bebb"
)吗?
答案 0 :(得分:1)
经过一些反复试验后,我设法弄明白了。
group2 = {
"$group" : {
"_id" : "$_id",
"count" : {
"$sum" : {"$cond" : [ {"$eq" : ["$comms.c", "56f3f70d4de8c74a69d1d5e1"] }, 1 ,0 ] }
}
}
}
我们总结的是comms.c
等于用户"56f3f70d4de8c74a69d1d5e1"
的情况。
结果:
{ "_id" : "5700edfe03fcdb000347bebb", "count" : 2 }