如何在MongoDB查询中进行集操作检查(超集、子集、联合)



假设我有一组作业:

{
_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的SUPERset的所有作业

    示例:query_tags = ["A", "B" ]->获取ID 3和4 的作业

  2. 获取tagsquery_tags子集的所有作业

    示例:query_tags = ["A", "XXXX"]->获取ID为1和2的作业

  3. 获取tagsquery_tags的并集不是空的所有作业

    示例:query_tags = ["A", "XXXX"]->获取ID为2、3和4的作业

    示例2:query_tags = ["B", "XXXX"]->获取ID 3和4 的作业

注意:对于情况1,我可能会使用$all,但是情况2和3呢?

  1. 超集:使用$setIsSubset
db.collection.find({
$expr: {
"$setIsSubset": [
[
"A",
"B"
],
"$tags"
]
}
})

这是Mongo游乐场供您参考。


  1. 子集:使用$setIsSubset,但相反
db.collection.find({
$expr: {
"$setIsSubset": [
"$tags",
[
"A",
"XXXX"
]
]
}
})

这是Mongo游乐场供您参考。


  1. 集合并集:这个对我来说有点困惑。只要你的query_tags不是空的,集合并集就会一直是非空的,所以每个文档都应该返回。不过,您可以使用$setUnion
db.collection.find({
$expr: {
$ne: [
{
"$setUnion": [
"$tags",
[
"A",
"XXXX"
]
]
},
[]
]
}
})

这是Mongo游乐场供您参考。

最新更新