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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:32:55