MongoDB:如何总结$ group聚合查询中的唯一字段?

时间:2016-06-10 18:29:56

标签: mongodb mongodb-query aggregation-framework

完成一些聚合魔法后,我有以下数据集:

{ "_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")吗?

1 个答案:

答案 0 :(得分:1)

经过一些反复试验后,我设法弄明白了。

group2 = {
    "$group" : {
        "_id" : "$_id",
        "count" : {
            "$sum" : {"$cond" : [ {"$eq" : ["$comms.c", "56f3f70d4de8c74a69d1d5e1"] }, 1 ,0 ] }
        }
    }
}

我们总结的是comms.c等于用户"56f3f70d4de8c74a69d1d5e1"的情况。

结果:

{ "_id" : "5700edfe03fcdb000347bebb", "count" : 2 }