在多个字段中搜索精确的数组值
Search Exact Array Values In Multiple Fields
我有一个集合,其中包含如下 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]
}
我想在集合中搜索下面的数组。
但所有数组值必须在字段 "arr" 或 "arr1".
中匹配
我的意思是数组值可以在任一字段中,但所有值都必须在文档中。
因此,当我在集合中搜索数组时,只有第二个具有名称:"B" 和第三个具有名称:"C" 文档应该是结果。
因为在第二个文件中; "arr" 字段中的第一个数组值 ( 3 ) 和 "arr1" 字段中的第二个和第三个数组值 (5 和 9)。在第三个文档中,"arr" 字段中的第一个和第二个 (3, 5) 数组值和 "arr1" 字段中的第三个数组值 (9)。
Array : [3, 5, 9]
你能帮帮我吗?
最好的方法是使用 $redact
运算符。
db.collection.aggregate([
{ "$redact": {
"$cond": [
{ "$setIsSubset": [ [3,5,9], { "$setUnion": [ "$arr", "$arr1" ] } ] },
"$$KEEP",
"$$PRUNE"
]}
}
])
您还可以将 $project
与 $setUnion
运算符一起使用
和 $match
。
db.collection.aggregate([
{ "$project": { "name": 1, "arr": 1, "arr1": 1, "allvalues": { "$setUnion": [ "$arr", "$arr1" ]}}},
{ "$match": { "allvalues": { "$all": [3, 5, 9] }}}
])
输出:
{ "_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 ] }
我有一个集合,其中包含如下 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]
}
我想在集合中搜索下面的数组。
但所有数组值必须在字段 "arr" 或 "arr1".
中匹配
我的意思是数组值可以在任一字段中,但所有值都必须在文档中。
因此,当我在集合中搜索数组时,只有第二个具有名称:"B" 和第三个具有名称:"C" 文档应该是结果。
因为在第二个文件中; "arr" 字段中的第一个数组值 ( 3 ) 和 "arr1" 字段中的第二个和第三个数组值 (5 和 9)。在第三个文档中,"arr" 字段中的第一个和第二个 (3, 5) 数组值和 "arr1" 字段中的第三个数组值 (9)。
Array : [3, 5, 9]
你能帮帮我吗?
最好的方法是使用 $redact
运算符。
db.collection.aggregate([
{ "$redact": {
"$cond": [
{ "$setIsSubset": [ [3,5,9], { "$setUnion": [ "$arr", "$arr1" ] } ] },
"$$KEEP",
"$$PRUNE"
]}
}
])
您还可以将 $project
与 $setUnion
运算符一起使用
和 $match
。
db.collection.aggregate([
{ "$project": { "name": 1, "arr": 1, "arr1": 1, "allvalues": { "$setUnion": [ "$arr", "$arr1" ]}}},
{ "$match": { "allvalues": { "$all": [3, 5, 9] }}}
])
输出:
{ "_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 ] }