【问题标题】:How can I delete duplicates in MongoDb?如何删除 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 删除所有记录,但首先删除。

标签: mongodb indexing duplicates duplicate-removal


【解决方案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 并重命名新集合。如图所示,此解决方案可用于一个或多个字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多