MongoDB聚合:基于嵌套数组属性过滤文档的实现问询
MongoDB聚合查询解决方案
需求分析
当文档的array数组中至少一个元素满足:其nestedArray2.valueToFilter值(ObjectId类型)不存在于对应元素的nestedArray.value集合(字符串类型)中时,返回该文档的_id和完整array属性;若所有元素的valueToFilter均匹配对应nestedArray.value,则不返回该文档。
聚合管道实现
[ { $match: { $expr: { $anyElementTrue: { $map: { input: "$array", as: "elem", in: { $anyElementTrue: { $map: { input: "$$elem.nestedArray2", as: "nf", in: { $not: { $in: [ "$$nf.valueToFilter", { $map: { input: "$$elem.nestedArray", as: "n", in: { $toObjectId: "$$n.value" } } } ] } } } } } } } } } }, { $project: { _id: 1, array: 1 } } ]
逻辑说明
- 类型统一:通过
$toObjectId将nestedArray.value的字符串类型转换为ObjectId,与nestedArray2.valueToFilter的类型保持一致,确保比较准确。 - 层级判断:
- 内层
$map+$anyElementTrue:检查单个array元素的nestedArray2中是否存在valueToFilter不在对应nestedArray.value集合中的情况。 - 外层
$map+$anyElementTrue:判断整个文档的array数组中是否存在至少一个符合上述条件的元素。
- 内层
- 结果投影:仅返回符合条件文档的
_id和完整array属性。
示例验证
针对提供的测试文档,array中的name2元素的nestedArray2.valueToFilter(ObjectId("661564ce168c8115295a8f29"))不在其nestedArray.value集合中,因此该文档会被返回,结果如下:
{ "_id": 1, "array": [ { "name": "name1", "nestedArray": [ { "value": "661564ce168c8115295a8f25" } ], "nestedArray2": [ { "valueToFilter": ObjectId("661564ce168c8115295a8f25") } ] }, { "name": "name2", "nestedArray": [ { "value": "661564ce168c8115295a8f27" }, { "value": "661564ce168c8115295a8f28" } ], "nestedArray2": [ { "valueToFilter": ObjectId("661564ce168c8115295a8f29") } ] } ] }
内容的提问来源于stack exchange,提问作者matthew
相关产品推荐
相关产品推荐

