使用SQL++查询过滤多层嵌套数组的实现方法
MongoDB嵌套数组过滤解决方案
针对你需要筛选出包含tr.x = "VALID"且check = false的文档,并剔除不符合条件的tr元素(同时移除无有效tr的p元素、无有效p的i元素)的需求,可以通过MongoDB的聚合管道实现,具体步骤如下:
聚合管道代码
db.collection.aggregate([ // 先筛选出至少存在符合条件tr元素的文档,减少后续计算量 { $match: { "i.p.tr": { $elemMatch: { x: "VALID", check: false } } } }, // 处理嵌套数组,过滤掉不符合条件的元素 { $set: { i: { $filter: { input: { $map: { input: "$i", as: "item", in: { // 保留i元素原有字段 i1: "$$item.i1", i2: "$$item.i2", p: { $filter: { input: { $map: { input: "$$item.p", as: "pItem", in: { // 保留p元素原有字段 id: "$$pItem.id", p2: "$$pItem.p2", tr: { // 过滤tr数组,只保留符合条件的元素 $filter: { input: "$$pItem.tr", as: "trItem", cond: { $and: [ { $eq: ["$$trItem.x", "VALID"] }, { $eq: ["$$trItem.check", false] } ] } } } } } }, // 过滤掉tr数组为空的p元素 as: "filteredP", cond: { $ne: ["$$filteredP.tr", []] } } } } } }, // 过滤掉p数组为空的i元素 as: "filteredI", cond: { $ne: ["$$filteredI.p", []] } } } } } ])
代码解释
- $match阶段:先定位出包含符合条件
tr元素的文档,避免对完全不符合的文档做后续处理,提升效率。 - $set阶段:重新构建
i数组,逐层处理嵌套结构:- 遍历
i数组,保留每个i元素的原有字段,同时处理其内部的p数组。 - 遍历
p数组,保留每个p元素的原有字段,用$filter筛选出tr中满足x="VALID"且check=false的元素。 - 过滤掉
tr数组为空的p元素,再过滤掉p数组为空的i元素,最终得到干净的嵌套结构。
- 遍历
执行结果
运行上述聚合管道后,会返回你期望的结果:
{ "version": 1, "root1": "root1", "root2": "root2", "i": [ { "i1": "i1", "i2": "i2", "p": [ { "id": 1, "p2": "p2", "tr": [ { "id": 1, "x": "VALID", "check": false } ] } ] } ] }
内容的提问来源于stack exchange,提问作者Oussama Cherni
相关产品推荐
相关产品推荐

