5

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

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

我的错误是 E11000 duplicate key error index: mydb.dummy_data.$url_1 dup key: {"some url"}

4

1 回答 1

3

因此,当您的语法从不正确的用法中更正为:

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

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

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

谷歌群组上有这条消息导致建议的方法:

嗨丹尼尔,

断言表明重复的数量达到或超过了 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();

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

于 2015-01-23T11:38:09.667 回答