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

MongoDB Lookup关联集合实现全状态客户分类查询问题

MongoDB客户分类聚合实现方案

针对你需要将客户分为四类的需求,调整聚合管道如下,可一次性获取所有分类结果:

const pipeline = [
    // 过滤目标Office的客户
    { $match: { OfficeId: "b5b5e2d9-c229-4a4d-843e-559f4fee400e" } },
    // 保留必要字段
    { $project: { _id: 1, Name: 1 } },
    // 关联processed.customers集合
    {
        $lookup: {
            from: "processed.customers",
            localField: "_id",
            foreignField: "_id",
            as: "processedInfo"
        }
    },
    // 添加分类标识,避免过滤掉无processed记录的客户
    {
        $addFields: {
            category: {
                $switch: {
                    branches: [
                        // 无processed记录:无需处理
                        { case: { $eq: [{ $size: "$processedInfo" }, 0] }, then: "无需处理" },
                        // status为null:待处理
                        { case: { $eq: [{ $arrayElemAt: ["$processedInfo.status", 0] }, null] }, then: "待处理" },
                        // status=1:处理成功
                        { case: { $eq: [{ $arrayElemAt: ["$processedInfo.status", 0] }, 1] }, then: "处理成功" },
                        // status=2:处理失败
                        { case: { $eq: [{ $arrayElemAt: ["$processedInfo.status", 0] }, 2] }, then: "处理失败" }
                    ],
                    default: "未知状态"
                }
            }
        }
    },
    // 按分类分组,输出各分类的客户列表
    {
        $facet: {
            "无需处理": [{ $match: { category: "无需处理" } }, { $project: { category: 0, processedInfo: 0 } }],
            "待处理": [{ $match: { category: "待处理" } }, { $project: { category: 0, processedInfo: 0 } }],
            "处理成功": [{ $match: { category: "处理成功" } }, { $project: { category: 0, processedInfo: 0 } }],
            "处理失败": [{ $match: { category: "处理失败" } }, { $project: { category: 0, processedInfo: 0 } }]
        }
    }
];

关键调整说明:

  • 避免丢失无processed记录的客户:移除原管道中的$unwind,它会默认删除关联结果为空数组的文档,导致"无需处理"的客户被过滤。改用$arrayElemAt直接取关联数组的第一个元素(因_id唯一,关联结果最多1条)。
  • 覆盖所有场景:通过$switch结合$size判断是否存在processed记录,再依次匹配status的不同取值,精准划分四类客户。
  • 一次性获取全部分类:使用$facet阶段将不同分类的结果分别输出,无需多次执行查询。

若仅需单独查询某一类客户,可在$addFields后直接添加$match过滤对应分类,比如查询处理失败的客户:

// 在$addFields后追加:
{ $match: { category: "处理失败" } },
{ $project: { category: 0, processedInfo: 0 } }

内容的提问来源于stack exchange,提问作者DValdir Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 13:59:21