我在 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"}
我在 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"}
因此,当您的语法从不正确的用法中更正为:
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();
但是,您处理从一个集合到另一个集合的迁移,在唯一键上有大量重复项,这似乎是目前处理它的唯一方法。