MongoDB:在嵌套Pipeline Lookup中添加多条件匹配查询
实现MongoDB嵌套Pipeline Lookup的多条件关联筛选
需求是筛选出满足以下任一条件的所有dashboard文档:
- 关联的
templatefolders.name等于'folder' - 关联的
templatefolders对应的folders.name等于'test1'
修改后的聚合查询代码
db.dashboard.aggregate([ { $lookup: { from: "templatefolders", let: { "boardId": "$_id" }, pipeline: [ { $match: { $expr: { $eq: ["$dashboardId", "$$boardId"] } } }, { $lookup: { from: "folders", let: { "folderId": "$folderId" }, pipeline: [ { $match: { $expr: { $eq: ["$_id", "$$folderId"] } } } ], as: "joinFolder" } }, // 添加条件匹配:保留满足任一条件的templatefolders { $match: { $or: [ // 条件1:当前templatefolders的name为'folder' { name: "folder" }, // 条件2:关联的folders中存在name为'test1'的文档 { $expr: { $anyElementTrue: { $map: { input: "$joinFolder", as: "folder", in: { $eq: ["$$folder.name", "test1"] } } } } } ] } } ], as: "joinDashboard" } }, // 过滤掉没有匹配到符合条件templatefolders的dashboard { $match: { $expr: { $gt: [{ $size: "$joinDashboard" }, 0] } } } ])
关键修改说明
在templatefolders的Pipeline中添加筛选逻辑:
完成与folders的关联后,新增$match阶段,用$or组合两个判断条件:- 直接匹配当前
templatefolders的name字段值 - 通过
$map遍历关联得到的joinFolder数组,用$anyElementTrue判断是否存在name为'test1'的文件夹
- 直接匹配当前
过滤无效dashboard文档:
最后新增$match阶段,通过判断joinDashboard数组长度大于0,确保只保留关联到符合条件templatefolders的dashboard。
结果验证
针对给定的测试数据集,执行查询后会返回dashboard1文档:
- 第一个关联的
templatefolders满足name='folder'的条件 - 第二个关联的
templatefolders对应的folders.name='test1',满足第二个条件
内容的提问来源于stack exchange,提问作者Mark_STUF
相关产品推荐
相关产品推荐

