如何使用 python 从 mongodb collection 中查找和删除重复文档

how to find and remove duplicates documents from mongodb collection using python

如何使用 python 从 mongodb 中查找和删除重复文档。 我们总共有 7 documents/records 个 documents/records 是重复的。所以需要找到那些重复的 document/records 并从相同的 collection 中删除。在文档中我们将有 100 个属性,因此我们无法根据少数属性找到文档。我们需要完全相同的副本 document/records

MongoDB collection

[
    { 'name': 'Amy', 'address': 'Apple st 652', 'age': 34 },
    { 'name': 'Hannah', 'address': 'Mountain 21', 'age': 34 },
    { 'name': 'Hannah', 'address': 'Mountain 21', 'age': 34 },
    { 'name': 'Amy', 'address': 'Apple st 652', 'age': 34 },
    { 'name': 'Richard', 'address': 'Sky st 331', 'age': 34 },
    { 'name': 'Chuck', 'address': 'Main Road 989', 'age': 34 },
    { 'name': 'Viola', 'address': 'Sideway 1633', 'age': 34 },
];

输出Collection

[
    { 'name': 'Amy', 'address': 'Apple st 652' },
    { 'name': 'Hannah', 'address': 'Mountain 21' },
    { 'name': 'Richard', 'address': 'Sky st 331' },
    { 'name': 'Chuck', 'address': 'Main Road 989' },
    { 'name': 'Viola', 'address': 'Sideway 1633' },
];

您可以使用代表完整文档的 $$ROOT 并对其进行分组,如下所示:

db.collection.aggregate([
  {
    $project: {
      _id: 0,
      
    }
  },
  {
    $group: {
      _id: "$$ROOT"
    }
  },
  {
    $replaceRoot: {
      newRoot: "$_id"
    }
  }
])

如您所见,我们必须删除 _id 字段,因为它是唯一的并且会破坏该方法,另外需要考虑的一点是,这会将整个集合加载到内存中。如果您的机器无法处理它,您别无选择,只能合并代码并对集合进行分页。

db.dup_doc.aggregate([
  {
    $project: {
      _id: 0,
      "name":"$name"
      
    }
  },
  {
    $group: {
      _id: "$$ROOT"
    }
  },
  {
    $replaceRoot: {
      newRoot: "$_id"
    }
  },
   { $out: 'dup_doc' }
])