【发布时间】:2016-06-11 03:22:01
【问题描述】:
完成一些聚合魔术后,我有以下数据集:
{ "_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 代表一个帖子,在帖子中,有 cmets。在这种情况下,有 3 个 cmets; 2 由同一评论员 ("56f3f70d4de8c74a69d1d5e1") 和另一位评论员 ("56f3f70d4de8c74a69d1d5e6")。
我想编写一个聚合查询,仅计算评论者 ("56f3f70d4de8c74a69d1d5e1") 的所有唯一 cmets,并返回评论者在帖子 "5700edfe03fcdb000347bebb" 上评论了两次。
我尝试了以下方法:
{ "$group" : { "_id" : "$_id", "count" : { "$sum" : "$comment.commentor" } } }
结果是:
{ "_id" : "5700edfe03fcdb000347bebb", "count" : 0 }
请注意,我并没有试图计算该帖子中所有评论者的所有 cmets,所以我不想这样做:
{ "$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" 发布的 cmets 数量?
【问题讨论】:
-
集合中不能有重复的
_id字段。你也从来没有说过你的结果应该是什么样子。' -
也许我应该更清楚一点,但一开始的数据集实际上是在聚合之后,这就是 _id 看起来重复的原因。
-
可以显示初始数据吗?也许有更好的方法来做你想做的事。
-
没关系,我已经想出了一个可行的解决方案 - 请参阅下面的答案以及显示我想要实现的查询结果。
-
问题是数据有多层聚合,所以如果我显示初始数据,它只会令人困惑。在我想计算特定用户的所有唯一值以保持问题简单之前,我只是在级别显示数据。
标签: mongodb mongodb-query aggregation-framework