5

i am running the query below in robomongo. bot it is giving an error as shown below? I am really trying to remove the duplcate enties in url field using this query. Is there any problem with my query?

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

My error is 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 に達したか、または超えたことを示しています。さらに、ソースには次のようなコメントがあります。限界。」(制限 == 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();

ただし、あるコレクションから別のコレクションへの移行にアプローチすると、一意のキーで大量の重複が発生するため、これが現在それを処理する唯一の方法のようです。

于 2015-01-23T11:38:09.667 に答える