MongoDB 布尔查询

MongoDB Boolean Query

我有如下文档故事集

[
    {
        createdBy:'user1',
        storyId:1,
        viewers:['user3'],
    },
     {
        createdBy:'user2',
        storyId:2,
        viewers:['user3'],
    },

    {
        createdBy:'user2',
        storyId:3,
        viewers:['user4'],
    },

    {
        createdBy:'user5',
        storyId:4,
        viewers:['user3'],
    },

    {
        createdBy:'user5',
        storyId:5,
        viewers:['user3'],
    }
]


假设user3请求获取他是否查看过特定用户的每个故事的状态。如果 viewers 数组在所有文档中包含他的用户 ID('user3'),我想 return TRUE 如果任何文档不包含他的用户 ID 在数组中,我想为 FALSE。希望你能理解我的问题。

预期输出

[
    {
        createdBy:'user1',
        isAllViewed: true
    },

    {
        createdBy:'user2',
        isAllViewed: false
    },

    {
        createdBy:'user5',
        isAllViewed: true
    },  
]

您可以试试这个聚合查询:

用和之前一样的思路,用$setInteresection知道数组中是否有user3。如果存在或不存在,它会生成一个值为 truefalse 的数组。

所以下一阶段是检查 $allElementsTrue

db.collection.aggregate([
  {
    "$group": {
      "_id": "$createdBy",
      "isAllViewed": {
        "$push": {
          "$ne": [
            {
              "$setIntersection": [
                "$viewers",
                [
                  "user3"
                ]
              ]
            },
            []
          ]
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "createdBy": "$_id",
      "isAllViewed": {
        "$allElementsTrue": "$isAllViewed"
      }
    }
  }
])

示例here

查询

  • 按创建者分组
  • 如果 user3 包含在“查看器”中,则创建一个 [true false ...] 数组
  • 然后检查该数组中的所有内容是否都为真

Test code here

db.collection.aggregate([
  {
    "$group": {
      "_id": "$createdBy",
      "isAllViewed": {
        "$push": {
          "$in": [
            "user3",
            "$viewers"
          ]
        }
      }
    }
  },
  {
    "$project": {
      "_id": 0,
      "createdBy": "$_id",
      "isAllViewed": {
        "$allElementsTrue": "$isAllViewed"
      }
    }
  }
])