假设我有这份文件
[
{
"_id": 1,
"array": [
{
"name": "name1",
"nestedArray": [
{
"value": "v1"
}
],
"nestedArray2": [
{
"valueToFilter": "v1"
}
]
},
{
"name": "name2",
"nestedArray": [
{
"value": "v1"
},
{
"value": "v2"
}
],
"nestedArray2": [
{
"valueToFilter": "v3"
}
]
}
]
}
]
我需要的是如果nestedArray2.valueToFilter中至少有一项不存在于nestedArray.value中,则获取_id和整个array
属性因此,在此示例中,聚合将返回此文档,因为至少一个 nestedArray.value 中不存在 nestedArray2.valueToFilter: v3
如果所有 valueToFilter 都存在于至少一个nestedArray.value中,则不要获取此文档
一般来说,我不推荐具有高度嵌套数组的模式。不过,在您的场景中,您可以首先对
array
执行逐元素操作,以计算 $setIntersection
和 nestedArray
的 $nestedArray2
。然后,使用 $anyElementTrue
过滤结果。
db.collection.aggregate([
{
"$set": {
"test": {
"$map": {
"input": "$array",
"as": "arr",
"in": {
"$setIntersection": [
"$$arr.nestedArray.value",
"$$arr.nestedArray2.valueToFilter"
]
}
}
}
}
},
{
"$match": {
$expr: {
"$anyElementTrue": {
"$map": {
"input": "$test",
"as": "t",
"in": {
$eq: [
[],
"$$t"
]
}
}
}
}
}
},
{
$unset: "test"
}
])
上面的游乐场演示了这些概念。您可以使用以下版本以获得简洁的语法。 蒙戈游乐场