したがって、構文が誤った使用法から次のように修正されると:
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();
ただし、あるコレクションから別のコレクションへの移行にアプローチすると、一意のキーで大量の重複が発生するため、これが現在それを処理する唯一の方法のようです。