如何在MongoDB投影阶段过滤嵌套数组?
解决MongoDB双层嵌套数组的过滤问题
你的问题出在直接对$list_L1.obj_L1.list_L2使用$filter时,list_L1本身是数组,这个表达式会返回数组的数组,而$filter只能处理单个数组,导致无法正确遍历内层元素,最终得到空数组。
正确的做法是先通过$map遍历外层的list_L1数组,再对每个元素内部的obj_L1.list_L2执行$filter,完整聚合管道如下:
db.collection.aggregate([ // 筛选包含符合条件元素的文档 {$match: { "list_L1.obj_L1.list_L2.go": "Y"}}, // 遍历外层数组,过滤内层数组元素 {$addFields: { "list_L1": { $map: { input: "$list_L1", as: "l1_item", in: { obj_L1: { list_L2: { $filter: { input: "$$l1_item.obj_L1.list_L2", as: "l2_item", cond: { $eq: ["$$l2_item.go", "Y"] } } } } } } } }} ])
执行逻辑说明
- $match阶段:保留所有包含
list_L2.go = "Y"元素的文档,排除id=2这类完全不符合的文档。 - $addFields阶段:
- 用
$map遍历list_L1中的每个元素(命名为l1_item)。 - 对每个
l1_item内部的obj_L1.list_L2数组,用$filter筛选出go字段等于"Y"的元素。 - 替换原
list_L1字段为处理后的结果,保持原文档结构不变。
- 用
执行后会得到你预期的输出:仅保留list_L2中go="Y"的元素,同时保留外层文档的结构。
内容的提问来源于stack exchange,提问作者arielCo
相关产品推荐
相关产品推荐

