$all
运算符选择字段值是包含所有指定元素的数组的文档。
在我的情况下,我需要相反的情况:选择文档的运算符,其中字段的值是一个数组,其元素都包含在指定的数组中。
例如,考虑以下集合:
{"name": 1, "vals": ["A", "B"]}
{"name": 2, "vals": ["D", "C"]}
{"name": 3, "vals": ["A", "D"]}
我想选择其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
:$elemMatch
对于早期版本的 MongoDB,使用运算符的双重否定可能会产生类似的结果(但不太明显):粗略翻译:“查找所有文档,其中该
vals
数组不包含所提供列表中的值以外的值”。