如何删除 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))
field1
和 field2
的组合应该是唯一的。
然后可以删除初始集合c1
并重命名新集合。如图所示,此解决方案可用于一个或多个字段。
【讨论】:
以上是关于如何删除 MongoDb 中的重复项?的主要内容,如果未能解决你的问题,请参考以下文章
如何从js中的数组中删除元素[元素来自mongodb] [重复]
如何从js中的数组中删除元素[元素来自mongodb] [重复]