【问题标题】:E11000 duplicate key error index: While Creating Unique indexE11000 重复键错误索引:创建唯一索引时
【发布时间】:2015-03-22 08:22:10
【问题描述】:

我正在 robomongo 中运行以下查询。 bot 它给出了如下所示的错误?我真的想使用此查询删除 url 字段中的重复实体。我的查询有问题吗?

db.dummy_data.createIndex({"url":1},{unique:true},{dropDups:true})

我的错误是 E11000 重复键错误索引:mydb.dummy_data.$url_1 重复键:{“some url”}

【问题讨论】:

  • 这是 JavaScript 而不是 Java。两种完全不同的东西。但是你的语法是错误的。应该是db.dummy_data.ensureIndex({ "url": 1},{ "unique": true, "dropDups: true }),这就是第三个对象被忽略的原因。
  • 但是它给出了这个错误 "connectionId" : 336, "err" : "E11000 duplicate key error index: client_mahout.dummy_data.$product_url_1 dup key: { : \"dl.google.com/dl/…\" }" ,“代码”:11000,“n”:0,“ok”:1
  • 请注意删除重复项是任意的。
  • 您应该发现的错字:db.dummy_data.ensureIndex({ "url": 1},{ "unique": true, "dropDups": true })。见:docs.mongodb.org/manual/reference/method/…
  • 还有@nothing 所说的。您无法控制丢弃的内容。

标签: javascript mongodb indexing robo3t


【解决方案1】:

所以当你的语法从不正确的用法更正为:

db.dummy_data.ensureIndex({ "url": 1},{ "unique": true, "dropDups": true })

您报告说您仍然收到一条错误消息,但是是一条新消息:

{ "connectionId" : 336, "err" : "使用 dropDups=true 构建索引时也可能重复", "code" : 10092, "n" : 0, "ok" : 1 }

有这个message on google groups 导致了建议的方法:

嗨,丹尼尔,

断言表明重复的数量达到或超过了 1000000。此外,源中有一条评论说,“我们可以在磁盘上排队,但通常只有很少的重复,所以我们保留在 ram并且有一个限度。” (其中限制 == 1000000),因此最好从一个空集合开始,使用 {dropDups: true} 确保索引,然后重新导入实际文档。

让我们知道这是否更适合您。

因此,正如所建议的那样,创建一个新集合并导入其中的所有内容。基本前提:

db.newdata.ensureIndex({ "url": 1},{ "unique": true, "dropDups": true });

db.dummy_data.find().forEach(function(doc) {
    db.newdata.insert(doc);
});

或者更好:

db.newdata.ensureIndex({ "url": 1},{ "unique": true, "dropDups": true });

var bulk = db.newdata.initializeUnOrderedBulkOp();
var counter = 0;

db.dummy_data.find().forEach(function(doc) {
    counter++;
    bulk.insert( doc );

    if ( counter % 1000 == 0 ) {
        bulk.execute();
        bulk = db.newdata.initializeUnOrderedBulkOp();
    }
});

if ( counter % 1000 != 0 )
    bulk.execute();

无论您如何处理从一个集合到另一个集合的迁移,在唯一键上存在大量重复项,这似乎是目前处理它的唯一方法。

【讨论】:

  • 仅供参考,dropDups 选项仅适用于在包含现有数据的集合上构建唯一索引时。如果要复制到新集合中,则会引发正常的重复键异常(您可以选择忽略)。还值得注意的是,dropDups 支持在 2.7.x 开发周期中根据SERVER-14710 被删除。非确定性数据删除可能会导致一些意想不到的后果(尤其是拼写错误或使用错误)。
  • @Stennie 那么,为问题提供切实可行的解决方案的赞成票在哪里?
猜你喜欢
  • 2017-03-02
  • 2016-10-31
  • 2019-07-11
  • 2017-01-03
  • 1970-01-01
  • 2017-05-25
  • 2018-01-19
相关资源
最近更新 更多