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
相关产品推荐
相关产品推荐

