我在robomongo中运行以下查询。机器人它给出了如下所示的错误?我真的试图使用此查询删除url字段中的duplcate enties。我的查询有问题吗?
db.dummy_data.createIndex({"url":1},{unique:true},{dropDups:true})
我的错误是 E11000重复键错误索引:mydb.dummy_data。$ url_1 dup key:{" some url"}
答案 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();
但是,您接近从一个集合迁移到另一个集合,在唯一键上有大量重复项,这似乎是目前处理它的唯一方法。