【问题标题】:MongoDB Use logical OR in group stageMongoDB 在小组赛中使用逻辑或
【发布时间】:2021-04-23 14:09:48
【问题描述】:

我有一个如下所示的 MongoDB 集合:

{user: "1", likes: 111, isEnabled: true},
{user: "1", likes: 222, isEnabled: false},
{user: "2", likes: 333, isEnabled: false},
{user: "2", likes: 444, isEnabled: false},

我想按用户对它们进行汇总,总结喜欢并检查用户的文档之一是否具有“isEnabled”= true(基本上是逻辑或)。

最后我想要这个结果:

{user: "1", allLikes: "333", isAnyEnabled: true},
{user: "2", allLikes: "777", isAnyEnabled: false},

我可以使用group阶段的$sum累加器来总结喜欢。我的问题是似乎没有 group 运算符支持布尔逻辑运算。有没有办法做到这一点?

到目前为止我已经尝试过了

db.myCollection.aggregate([{$match: {
    "_id":"$user",
    "allLikes": {
      "$sum": "$likes"
    },
    "isAnyEnabled":{"$or":"$isEnabled"}
}}])

但似乎不支持$orunknown group operator '$or'

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您可以在这样的项目阶段使用$anyElementTrue

    • 首先$group_id 获得所有喜欢的总和以及所有isEnabled 值的列表
    • 然后使用$anyElementTrue检查是否至少有一个true,然后isAnyEnabled是真还是假。
    db.collection.aggregate([
      {
        "$group": {
          "_id": "$user",
          "allLikes": {
            "$sum": "$likes"
          },
          "enabled": {
            "$push": "$isEnabled"
          }
        }
      },
      {
        "$project": {
          "_id": "$_id",
          "allLikes": "$allLikes",
          "isAnyEnabled": {
            "$anyElementTrue": [
              "$enabled"
            ]
          }
        }
      }
    ])
    

    例如here

    【讨论】:

      猜你喜欢
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-01
      • 2016-04-20
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多