如何在MongoDB中关联两集合查询版本不一致的文档_id
解决方案
你已经完成了$lookup关联两个集合的步骤,后续补充3个聚合阶段即可实现需求,完整可运行代码如下:
db.getCollection("Supplier1").aggregate([ { $lookup: { from: "Supplier2", localField: "_id", foreignField: "_id", as: "selected-supplier" } }, // 拆分$lookup返回的关联结果数组 { $unwind: "$selected-supplier" }, // 筛选两边版本号不一致的记录 { $match: { $expr: { $ne: ["$version", "$selected-supplier.version"] } } }, // 仅输出符合条件的文档_id { $project: { _id: 1 } } ])
步骤说明
$unwind:$lookup关联后返回的selected-supplier是数组格式(即使只匹配到1条记录也会生成长度为1的数组),通过$unwind可以将数组拆解为单个对象结构,方便后续直接取字段做对比$match:借助$expr支持聚合表达式的字段对比能力,用$ne判断Supplier1的version字段和关联得到的Supplier2的version字段是否不相等,仅保留符合条件的记录$project:指定返回结果只包含_id字段,过滤冗余字段,输出结果更精简
边界情况适配
如果你的业务场景中,Supplier1存在的_id在Supplier2中没有对应文档,也需要被算作「版本不一致」返回,可以把$unwind阶段替换为以下写法,避免这类空关联记录被过滤:
{ $unwind: { path: "$selected-supplier", preserveNullAndEmptyArrays: true } }
这种写法下,Supplier2无对应文档的记录selected-supplier为null,对比version时会判定为不相等,会被正常返回,可根据实际业务需求选择是否添加该配置。
内容的提问来源于stack exchange,提问作者Chandana Indisooriya
相关产品推荐
相关产品推荐

