我在mongodb中有一个大型集合(约270万个文档),并且有很多重复项。我尝试在集合上运行ensureIndex({id:1}, {unique:true, dropDups:true})
。在决定too many dups on index build with dropDups=true
之前,Mongo会匆匆离开它。
如何添加索引并删除重复项?或者反过来说,删除一些重复的最佳方法是什么,以便mongo可以成功构建索引?
对于奖励积分,为什么可以删除的重复次数有限制?
答案 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})})
field1
和field2
的组合应该是唯一的。
然后可以删除初始集合c1
并重命名新集合。如图所示,此解决方案可用于一个或多个字段。