E11000重复键错误索引:创建唯一索引时

时间:2015-01-23 10:10:04

标签: javascript mongodb indexing robo3t

我在robomongo中运行以下查询。机器人它给出了如下所示的错误?我真的试图使用此查询删除url字段中的duplcate enties。我的查询有问题吗?

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

我的错误是 E11000重复键错误索引:mydb.dummy_data。$ url_1 dup key:{" some url"}

1 个答案:

答案 0 :(得分:3)

因此,当您的语法从错误的用法更正为:

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}的ensureIndex,然后重新导入实际文档。

     

请告诉我们这是否适合您。

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

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();

但是,您接近从一个集合迁移到另一个集合,在唯一键上有大量重复项,这似乎是目前处理它的唯一方法。