在$all
操作者选择的文件,其中一个字段的值是包含所有指定元素的数组。
在我的情况下,我需要相反的内容:选择文档的运算符,其中字段的值是一个数组,其元素都包含在指定的数组中。
例如,考虑以下集合:
{"name": 1, "vals": ["A", "B"]}
{"name": 2, "vals": ["D", "C"]}
{"name": 3, "vals": ["A", "D"]}
Run Code Online (Sandbox Code Playgroud)
我想选择其vals
字段包含值的所有文档["A", "B", "D"]
;也就是说,文档 1 和 3(不是 2,因为指定的数组中不包含“C”)。
我不能使用{vals: {$all: ["A", "B", "D"]}}
,也不能{vals: ["A", "B", "D"]}
因为这两个操作选择其vals
字段包含所有指定值的文档,这不是我想要的。
我需要的可能吗?
根据您的 MongoDB 服务器版本,有几种方法可以解决这个问题。
在 MongoDB 3.6+ 中,您可以通过运算符使用 $setIsSubset
表达式(true
仅当给出的第一个数组是第二个数组的子集时)$expr
:
> db.haystack.find({$expr:{$setIsSubset:["$vals",["A","B","D"]]}},{_id:0})
{
"name": 1,
"vals": [
"A",
"B"
]
}
{
"name": 3,
"vals": [
"A",
"D"
]
}
Run Code Online (Sandbox Code Playgroud)
对于早期版本的 MongoDB,使用$elemMatch
运算符的双重否定可能会产生类似的结果(但不太明显):
> db.haystack.find({$nor:[{vals:{$elemMatch:{$nin:["A","B","D"]}}}]},{_id:0})
{
"name": 1,
"vals": [
"A",
"B"
]
}
{
"name": 3,
"vals": [
"A",
"D"
]
}
Run Code Online (Sandbox Code Playgroud)
粗略翻译:“查找所有文档,其中vals
数组不包含所提供列表中的值以外的值”。