如何删除MongoDb中的重复项?

时间:2012-02-17 23:59:24

标签: mongodb indexing duplicates duplicate-removal

我在mongodb中有一个大型集合(约270万个文档),并且有很多重复项。我尝试在集合上运行ensureIndex({id:1}, {unique:true, dropDups:true})。在决定too many dups on index build with dropDups=true之前,Mongo会匆匆离开它。

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

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

2 个答案:

答案 0 :(得分:5)

  

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

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

  

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

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

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

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

答案 1 :(得分:3)

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

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

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