MongoDB如何查询符合ID与attribute1条件的顶级文档和嵌套子文档
实现方案
你可以通过MongoDB聚合管道实现该需求,具体实现逻辑和代码如下:
- 先过滤出可能匹配的文档:仅保留顶级字段匹配、或subDocument中存在匹配项的文档,减少后续计算量
- 把顶级文档的
ID、attribute1字段拼接为独立对象,和subDocument数组合并为统一的候选数组,不用再分两类情况单独处理 - 拆分候选数组为单条记录,过滤出完全符合查询条件的对象
- 最后调整输出格式,仅保留要求的两个字段
示例代码(替换queryID和queryAttr为实际查询参数即可):
const queryID = "2"; const queryAttr = "456"; db.collection.aggregate([ { $match: { $or: [ { ID: queryID, attribute1: queryAttr }, { subDocument: { $elemMatch: { ID: queryID, attribute1: queryAttr } } } ] } }, { $addFields: { allCandidates: { $concatArrays: [ [{ ID: "$ID", attribute1: "$attribute1" }], "$subDocument" ] } } }, { $unwind: "$allCandidates" }, { $match: { "allCandidates.ID": queryID, "allCandidates.attribute1": queryAttr } }, { $replaceRoot: { newRoot: "$allCandidates" } }, { $project: { ID: 1, attribute1: 1, _id: 0 } } ])
测试效果:
- 传入
queryID = "1"、queryAttr = "123"时,返回匹配的顶级文档 - 传入
queryID = "2"、queryAttr = "456"时,返回匹配的subDocument子项
内容的提问来源于stack exchange,提问作者harryk
相关产品推荐
相关产品推荐

