"dropDups" インデックス作成の構文は、MongoDB 2.6で「非推奨」になり、MongoDB3.0で削除されました。 「削除」は任意であり、「重複」は削除される可能性があるため、ほとんどの場合、これを使用することはあまり良い考えではありません。つまり、「削除」されるのは、本当に削除したいものではない可能性があります。
とにかく、ここでのインデックスキーの値は許可されているよりも長くなるため、「インデックスの長さ」エラーが発生します。一般的に言って、通常のアプリケーションで43フィールドにインデックスを付けることは「意味がありません」。
コレクションから「重複」を削除する場合は、集計クエリを実行して「重複」データが含まれているドキュメントを特定し、そのリストを循環して、すでに「一意」の「1つを除くすべて」を削除することをお勧めします。 code> _id ターゲットコレクションからの値。これは、最大の効率を得るために「一括」操作で実行できます。
注 :あなたのドキュメントに実際に43の「一意の」フィールドが含まれているとは信じがたいです。 「必要なものはすべて」 単にのみを識別することです ドキュメントを「一意」にし、以下に概説するプロセスに従うフィールド:
var bulk = db.testkdd.initializeOrderedBulkOp(),
count = 0;
// List "all" fields that make a document "unique" in the `_id`
// I am only listing some for example purposes to follow
db.testkdd.aggregate([
{ "$group": {
"_id": {
"duration" : "$duration",
"protocol_type": "$protocol_type",
"service": "$service",
"flag": "$flag"
},
"ids": { "$push": "$_id" },
"count": { "$sum": 1 }
}},
{ "$match": { "count": { "$gt": 1 } } }
],{ "allowDiskUse": true}).forEach(function(doc) {
doc.ids.shift(); // remove first match
bulk.find({ "_id": { "$in": doc.ids } }).remove(); // removes all $in list
count++;
// Execute 1 in 1000 and re-init
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.testkdd.initializeOrderedBulkOp();
}
});
if ( count % 1000 != 0 )
bulk.execute();
2.6より「低い」バージョンのMongoDBがあり、一括操作がない場合は、標準の .remove()
で試すことができます。 ループ内にも。 .aggregate()
にも注意してください ここにカーソルは返されません。ループは次のように変更する必要があります:
db.testkdd.aggregate([
// pipeline as above
]).result.forEach(function(doc) {
doc.ids.shift();
db.testkdd.remove({ "_id": { "$in": doc.ids } });
});
ただし、ドキュメントを注意深く確認し、グループ化 _id
の一部であると予想される「一意の」フィールドのみを含めるようにしてください。 。そうしないと、重複がないため、何も削除されなくなります。