在多个字段中搜索精确数组值

bar*_*maz 2 mongodb mongodb-query aggregation-framework

我有一个集合,有3个文件,如下所示:

Collection:
{
    name: "A",
    arr: [1, 2, 3],
    arr1: [4, 5, 6]
},
{
    name: "B",
    arr: [3, 7, 11],
    arr1: [5, 6, 9]
},
{
    name: "C",
    arr: [3, 4, 5],
    arr1: [7, 9, 12]
}
Run Code Online (Sandbox Code Playgroud)

我想在集合中搜索下面的数组.
但是所有数组值必须在字段"arr"或"arr1"中匹配.
我的意思是数组值可以在任一字段中,但所有值必须在文档中.
因此,当我在集合中搜索数组时,只有第二个名称为"B",第三个名称为:"C"文档应该是结果.
因为在第二份文件中; "arr"字段中的第一个数组值(3)以及"arr1"字段中的第二个和第三个数组值(5和9).在第三个文档中,"arr"字段中的第一个和第二个(3,5)数组值以及"arr1"字段中的第三个数组值(9).

Array : [3, 5, 9]
Run Code Online (Sandbox Code Playgroud)

你能帮助我吗?

sty*_*ane 7

执行此$redact操作的最佳方法是使用运算符.

db.collection.aggregate([
    { "$redact": {
        "$cond": [
            { "$setIsSubset": [ [3,5,9], { "$setUnion": [ "$arr", "$arr1" ] } ] }, 
            "$$KEEP", 
            "$$PRUNE" 
         ]}
    }
])
Run Code Online (Sandbox Code Playgroud)

您也可以$project$setUnion运营商一起使用$match.

db.collection.aggregate([
    { "$project": { "name": 1, "arr": 1, "arr1": 1, "allvalues": { "$setUnion": [ "$arr", "$arr1" ]}}}, 
    { "$match": { "allvalues": { "$all": [3, 5, 9] }}}
])
Run Code Online (Sandbox Code Playgroud)

输出:

{ "_id" : ObjectId("55d48fd2939d0f7d372d6dbe"), "name" : "B", "arr" : [ 3, 7, 11 ], "arr1" : [ 5, 6, 9 ] }
{ "_id" : ObjectId("55d48fd2939d0f7d372d6dbf"), "name" : "C", "arr" : [ 3, 4, 5 ], "arr1" : [ 7, 9, 12 ] }
Run Code Online (Sandbox Code Playgroud)