首页 > 解决方案 > 从 mongo db 中删除除一个重复项之外的所有重复项

问题描述

所以我犯了这个错误,两次保存了很多文档,因为我弄乱了我的文档 ID。因为我做了一个插入,所以每次我保存它们时都会增加我的文档。所以我想删除我写的除第一个之外的所有重复项。幸运的是,这些文档有一个隐含的唯一键 ( match._id),我应该能够分辨出第一个是什么,因为我使用的是对象 ID。

文件如下所示:

{
  _id: "5e8e2d28ca6e660006f263e6"
  match : {
    _id:  2345
    ...
  }
  ...
}

所以,现在我有一个聚合,它告诉我哪些元素被复制并将它们存储在一个集合中。肯定有一种更优雅的方式,但我仍在学习。

[{$sort: {"$_id": 1},
{$group: {
  _id: "$match._id",
  duplicateIds: {$push: "$_id"},
  count: {$sum: 1}
}},
{$match: {
  count: { $gt: 1 }
}}, {$addFields: {
  deletableIds: { $slice: ["$duplicateIds", 1, 1000 ] }
}},
{$out: 'DeleteableIds'}]

现在我不知道如何进一步进行,因为它似乎在聚合中没有“删除”操作,我不想将这些临时数据写入数据库,这样我就可以用它编写删除命令,因为我想一口气删除它们。有没有其他方法可以做到这一点?我还在用 mongodb 学习,感觉有点不知所措:/

标签: mongodbaggregation

解决方案


但是,我认为您在正确的轨道上,要删除您发现的重复项,您可以在集合上使用批量写入。

因此,如果我们假设您的聚合查询将以下内容保存在DeleteableIds集合中

> db.DeleteableIds.insertMany([
... {deletableIds: [1,2,3,4]},
... {deletableIds: [103,35,12]},
... {deletableIds: [345,311,232,500]}
... ]);

我们现在可以使用它们并编写一个批量写入命令:

const bulkwrite = db.DeleteableIds.find().map(x => ({ deleteMany : { filter: { _id: { $in: x.deletableIds } } } }))

然后我们可以对数据库执行它。

> db.collection1.bulkWrite(bulkwrite)

这将删除所有重复项。


推荐阅读