如何删除 MongoDb 中的重复项?

Posted

技术标签:

【中文标题】如何删除 MongoDb 中的重复项?【英文标题】:How can I delete duplicates in MongoDb? 【发布时间】:2012-02-17 23:59:24 【问题描述】:

我在 mongodb 中有一个大型集合(约 270 万个文档),并且有很多重复项。我尝试在集合上运行ensureIndex(id:1, unique:true, dropDups:true)。 Mongo 在它决定 too many dups on index build with dropDups=true 之前对其进行了一段时间的搅动。

如何添加索引并消除重复项?或者反过来,删除一些 dup 以便 mongo 可以成功构建索引的最佳方法是什么?

对于奖励积分,为什么对可以丢弃的重复次数有限制?

【问题讨论】:

作为一个选项:运行一个 map/reduce 来计算每个 id 的出现次数。然后遍历这个结果集,并为每个带有重复项的 id 删除所有记录,但首先删除。 【参考方案1】:

对于奖励积分,为什么对可以丢弃的重复次数有限制?

MongoDB 这样做可能是为了保护自己。如果您 dropDups 在错误的字段上,您可以使用删除操作(与写入“一样昂贵”)来处理整个数据集并锁定数据库。

如何添加索引并消除重复项?

那么第一个问题是为什么要在id 字段上创建唯一索引?

MongoDB 创建一个默认的_id 字段,该字段自动唯一索引。默认情况下,MongoDB 使用ObjectId 填充_id,但是,您可以使用您喜欢的任何值覆盖它。 因此,如果您有一组现成的 ID 值,则可以使用这些值

如果您无法重新导入这些值,请将它们复制到新集合中,同时将 id 更改为 _id。然后,您可以删除旧集合并重命名新集合。 (请注意,您会收到一堆“重复键错误”,请确保您的代码捕获并忽略它们

【讨论】:

需要编辑!由于 MongoDB >= 3.* 的变化【参考方案2】:

我在尝试找到解决“重复次数过多”问题的解决方法时遇到了这个问题(无需从源代码重新创建集合)。我最终做到这一点的方法是创建一个新集合c2,在所需字段上添加一个唯一索引(纯粹是为了加快速度),然后执行 upsert:

db.c1.find().forEach(function(x)db.c2.update(field1:x.field1, field2:x.field2, x, upsert:true))

field1field2 的组合应该是唯一的。 然后可以删除初始集合c1 并重命名新集合。如图所示,此解决方案可用于一个或多个字段。

【讨论】:

以上是关于如何删除 MongoDb 中的重复项?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除已经在list中的重复项

如何从js中的数组中删除元素[元素来自mongodb] [重复]

如何从js中的数组中删除元素[元素来自mongodb] [重复]

如何在 Mongoose(MongoDB 包装器)中删除一行 [重复]

Oracle SQL:如何删除 listagg 中的重复项

如何删除 MySQL 表中的重复项