MongoDB聚合查询:查找companyId与name重复的客户数据
解决MongoDB查询companyId和name均重复的客户记录问题
1. 获取重复的companyId与name组合
如果只需要知道哪些companyId和name的组合存在重复,以及对应的重复次数,用聚合管道分组筛选即可:
db.customers.aggregate([ // 按companyId和name分组,统计每组的记录数量 { $group: { _id: { companyId: "$companyId", name: "$name" }, duplicateCount: { $sum: 1 } } }, // 筛选出重复次数大于1的组合 { $match: { duplicateCount: { $gt: 1 } } }, // 调整输出格式,去掉默认的_id嵌套结构 { $project: { _id: 0, companyId: "$_id.companyId", name: "$_id.name", duplicateCount: 1 } } ])
输出示例(假设存在两组重复数据):
[ { "companyId": "companyId1", "name": "John", "duplicateCount": 2 }, { "companyId": "companyId2", "name": "Alice", "duplicateCount": 3 } ]
2. 获取所有重复的具体客户记录
如果需要获取属于重复组合的完整文档,有两种实现方式:
方式一:单聚合管道完成
db.customers.aggregate([ // 第一步:找出重复组合并记录对应文档的_id { $group: { _id: { companyId: "$companyId", name: "$name" }, count: { $sum: 1 }, recordIds: { $push: "$_id" } } }, { $match: { count: { $gt: 1 } } }, // 第二步:关联原集合获取完整记录 { $lookup: { from: "customers", localField: "recordIds", foreignField: "_id", as: "duplicateRecords" } }, // 展开嵌套的记录数组 { $unwind: "$duplicateRecords" }, // 提取需要的字段 { $project: { _id: "$duplicateRecords._id", companyId: "$duplicateRecords.companyId", name: "$duplicateRecords.name" } } ])
方式二:先查重复组合再匹配记录
// 先获取所有重复的companyId+name组合 const duplicatePairs = db.customers.aggregate([ { $group: { _id: { companyId: "$companyId", name: "$name" }, count: { $sum: 1 } } }, { $match: { count: { $gt: 1 } } }, { $project: { _id: 1 } } ]).toArray().map(item => item._id); // 查询所有属于这些组合的完整记录 db.customers.find({ $or: duplicatePairs.map(pair => ({ companyId: pair.companyId, name: pair.name })) })
内容的提问来源于stack exchange,提问作者Cineno28
相关产品推荐
相关产品推荐

