MongoDB如何同时查询顶层文档与内嵌子文档并返回匹配结果
MongoDB跨顶层/内嵌子文档的统一查询实现
实现思路
- 首先将顶层成年人文档和
kids数组内的所有孩子文档合并为同一层级的人员列表,消除结构差异 - 对合并后的列表做统一条件匹配,最后返回完全符合要求的人员文档即可
通用聚合查询语句
db.collection.aggregate([ // 1. 合并顶层成人与内嵌孩子为统一人员数组 { $addFields: { all_persons: { $concatArrays: [ // 把顶层文档自身转为数组元素,有其他需要返回的字段可在此处补充映射 [ { ID: "$ID", attribute1: "$attribute1", array: "$array" } ], // 合并kids数组,无kids字段时默认取空数组避免报错 { $ifNull: ["$kids", []] } ] } } }, // 2. 展开人员数组为单条独立记录 { $unwind: "$all_persons" }, // 3. 替换根节点为人员文档,消除外层冗余字段 { $replaceRoot: { newRoot: "$all_persons" } }, // 4. 填写查询条件即可,无需区分匹配对象是成人还是孩子 { $match: {} } ])
场景1查询示例
匹配顶层成年人时,$match节点填写如下条件即可:
{ ID: "1", attribute1: "123", "array.field1": "f1" }
返回结果和要求完全一致。
场景2查询示例
匹配内嵌孩子时,$match节点填写如下条件即可:
{ ID: "2", attribute1: "456", attribute2: "222", "array.field1": "f2" }
返回结果符合要求。
补充说明:如果需要
array数组的某一个元素完全满足多字段匹配条件,可将字段匹配写法替换为array: { $elemMatch: { field1: "xxx", 其他字段: "xxx" } }即可。
内容的提问来源于stack exchange,提问作者harryk
相关产品推荐
相关产品推荐

