【问题标题】:I'm having trouble with a mongodb function that should be finding duplicates我在使用应该查找重复项的 mongodb 函数时遇到问题
【发布时间】:2021-05-02 20:24:45
【问题描述】:

我有以下函数,它应该根据电子邮件键返回重复项的 _id 值。但是,无论我尝试了什么,我都无法让函数返回任何空对象以外的任何内容。我在这里想念什么?还是有更好的方法我应该考虑?

var duplicates = [];
db.medicallists
  .aggregate([
    {
      $group: {
        _id: {
          email: "$email"
        },
        duplicate_ids: { $addToSet: "$_id" },
        count: { $sum: 1 }
      }
    },
    {
      $match: {
        count: { $gt: 1 }
      }
    },
    
  ], { allowDiskUse: true })
  .forEach(function(doc) {
    doc.duplicate_ids.shift(); // First element skipped for deleting
    doc.duplicate_ids.forEach(function(dupId) {
      duplicates.push(dupId); // Getting all duplicate ids
    });
  });
printjson(duplicates);

编辑: 这是一个示例文档:

{
_id : 5a2fed0c8023cf7ea2346067,
primary_spec : "Addiction Medicine",
first_name : "John",
last_name : "Sample",
city : "Las Vegas",
state : "NV",
phone : "1111111111",
fax : "1111111111",
email : "sample@aol.com"
}

【问题讨论】:

  • 您能提供一个示例文档吗?
  • @codemonkey 好主意。我已经编辑了问题以包含它。

标签: mongodb


【解决方案1】:

我已经在类似的数据集上测试了您的特定查询,它工作正常。 printjson(duplicates); 打印出所有重复的 id。

事实上,这也会删除所有基于电子邮件的重复条目:

db.collection.aggregate([
  {
    $group: {
      _id: {
        email: "$email"
      },
      duplicate_ids: {
        $push: "$_id"
      },
      count: {
        $sum: 1
      }
    }
  },
  {
    $match: {
      count: {
        $gt: 1
      }
    }
  },
  
]).forEach(function(doc){
  doc.duplicate_ids.shift();
  db.collection.remove({
    _id: {
      $in: doc.duplicate_ids
    }
  });
})

我的起始设置是:

{
        "_id" : ObjectId("6014331de1ef9ab1f708ddd9"),
        "item" : "card",
        "email" : "zzz@yahoo.com"
}
{
        "_id" : ObjectId("6014331de1ef9ab1f708ddda"),
        "item" : "card",
        "email" : "eee@yahoo.com"
}
{
        "_id" : ObjectId("6014331de1ef9ab1f708dddb"),
        "item" : "card",
        "email" : "zzz@yahoo.com"
}
{
        "_id" : ObjectId("6014331de1ef9ab1f708dddc"),
        "item" : "card",
        "email" : "aaa@yahoo.com"
}

运行查询后,变成:

{
        "_id" : ObjectId("6014331de1ef9ab1f708ddd9"),
        "item" : "card",
        "email" : "zzz@yahoo.com"
}
{
        "_id" : ObjectId("6014331de1ef9ab1f708ddda"),
        "item" : "card",
        "email" : "eee@yahoo.com"
}
{
        "_id" : ObjectId("6014331de1ef9ab1f708dddc"),
        "item" : "card",
        "email" : "aaa@yahoo.com"
}

在 MongoDB 服务器版本上测试:4.2.7

【讨论】:

  • 谢谢!我修改了我的脚本,使其与您所做的相匹配。它返回 True,但随后不会从集合中删除任何重复记录。关于我可能做错的任何建议?
  • @ffcgoering 只运行聚合部分,看看您是否真正返回任何记录。我假设你在终端中,所以运行从db.medicallists.aggregate([...], { allowDiskUse: true }) 的部分,看看你得到了什么。
  • 只运行聚合部分只返回“true”
  • @ffcgoering 所以这似乎是个问题。聚合似乎没有抓住任何东西。尝试将聚合中的$gt: 1 部分更改为$gt: 0,看看是否有任何收获。如果你这样做了,那么就没有重复的电子邮件。如果您仍然不这样做,他们正在发生其他事情。这是一个供你测试的游乐场:mongoplayground.net/p/ZPJQkL8zr_h
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多