假设我有一组作业:
{
_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
之间的设置操作查询某些作业?具体而言:
获取
tags
是query_tags
的SUPERset的所有作业示例:
query_tags = ["A", "B" ]
->获取ID 3和4 的作业获取
tags
是query_tags
子集的所有作业示例:
query_tags = ["A", "XXXX"]
->获取ID为1和2的作业获取
tags
和query_tags
的并集不是空的所有作业示例:
query_tags = ["A", "XXXX"]
->获取ID为2、3和4的作业示例2:
query_tags = ["B", "XXXX"]
->获取ID 3和4 的作业
注意:对于情况1,我可能会使用$all,但是情况2和3呢?
- 超集:使用
$setIsSubset
db.collection.find({
$expr: {
"$setIsSubset": [
[
"A",
"B"
],
"$tags"
]
}
})
这是Mongo游乐场供您参考。
- 子集:使用
$setIsSubset
,但相反
db.collection.find({
$expr: {
"$setIsSubset": [
"$tags",
[
"A",
"XXXX"
]
]
}
})
这是Mongo游乐场供您参考。
- 集合并集:这个对我来说有点困惑。只要你的
query_tags
不是空的,集合并集就会一直是非空的,所以每个文档都应该返回。不过,您可以使用$setUnion
db.collection.find({
$expr: {
$ne: [
{
"$setUnion": [
"$tags",
[
"A",
"XXXX"
]
]
},
[]
]
}
})
这是Mongo游乐场供您参考。