MongoDB:用于匹配元素都包含在指定数组中的数组的运算符

rub*_*bik 4 mongodb operator

$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字段包含所有指定值的文档,这不是我想要的。

我需要的可能吗?

Ste*_*nie 6

根据您的 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数组不包含所提供列表中的值以外的值”。