首页 > 解决方案 > MongoDB 在小组赛中使用逻辑或

问题描述

我有一个 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},

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

到目前为止我试过这个

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

但似乎$or不支持此:unknown group operator '$or'

标签: mongodbaggregation-framework

解决方案


您可以$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"
        ]
      }
    }
  }
])

这里的例子


推荐阅读