You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:51:47