如何在MongoDB查询(超集、子集、并集)中设置操作检查

vjrehmav  于 2022-10-22  发布在  Go
关注(0)|答案(1)|浏览(167)

假设我有一个作业集合:

{
       _id: ObjectId("1"),
       tags: []
    }
    {
       _id: ObjectId("2"),
       tags: ["A"]
    }
    {
       _id: ObjectId("3"),
       tags: ["A", "B"]
    }
    {
       _id: ObjectId("4"),
       tags: ["A", "B", "C" ]
    }

如何根据作业tags和一些作业query_tags之间的集合运算来查询一些作业?具体地说,就是:
1.获取tagsquery_tags的超集的所有作业
示例:query_tags = ["A", "B" ]->获取ID为3和4的作业
1.获取tagsquery_tags的子集的所有作业
示例:query_tags = ["A", "XXXX"]->获取ID为1和2的作业
1.获取tagsquery_tags的并不为空的所有作业
示例:query_tags = ["A", "XXXX"]->获取ID为2、3和4的作业
示例2:query_tags = ["B", "XXXX"]->获取ID为3和4的作业
注意:对于案例1,我可能可以使用$all,但是案例2和案例3呢?

qoefvg9y

qoefvg9y1#

1.超集:使用$setIsSubset

db.collection.find({
  $expr: {
    "$setIsSubset": [
      [
        "A",
        "B"
      ],
      "$tags"
    ]
  }
})

这是供您参考的Mongo Playground
1.子集:使用$setIsSubset,但相反

db.collection.find({
  $expr: {
    "$setIsSubset": [
      "$tags",
      [
        "A",
        "XXXX"
      ]
    ]
  }
})

这是供您参考的Mongo Playground
1.套装组合:这一套让我有点困惑。只要您的query_tags是非空的,集合并集就总是非空的,所以应该返回每个文档。不过,您可以使用$setUnion

db.collection.find({
  $expr: {
    $ne: [
      {
        "$setUnion": [
          "$tags",
          [
            "A",
            "XXXX"
          ]
        ]
      },
      []
    ]
  }
})

这是供您参考的Mongo Playground

相关问题