【问题标题】:MongoDB: How do I sum up a unique field in $group aggregation query?MongoDB:如何总结 $group 聚合查询中的唯一字段?
【发布时间】: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


【解决方案1】:

所以经过一番反复试验,我设法弄明白了。

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

我们在 comms.c 等于用户 "56f3f70d4de8c74a69d1d5e1" 的条件下对 1 求和。

结果:

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

【讨论】:

    猜你喜欢
    • 2020-09-22
    • 2020-06-13
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    相关资源
    最近更新 更多