1. ホーム
  2. mongodb

[解決済み] Mongodbでキーに基づいた重複を削除する方法は?

2022-02-10 19:13:55

質問内容

MongoDBに約300万件のレコードがあるコレクションがあります。私のサンプルレコードは次のようになります。

 { "_id" = ObjectId("50731xxxxxxxxxxxxxxxxxxxx"),
   "source_references" : [
                           "_id" : ObjectId("5045xxxxxxxxxxxxxx"),
                           "name" : "xxx",
                           "key" : 123
                          ]
 }

コレクションに同じレコードが多数重複しています。 source_references.key . (重複しているという意味です。 source_references.key ではなく _id ).

に基づいて重複するレコードを削除したい。 source_references.key 私は、各レコードをトラバースし、存在する場合はレコードを削除するいくつかのPHPコードを記述することを考えています。

Mongo Internalのコマンドラインで重複を削除する方法はありますか?

どのように解決するのですか?

この回答は時代遅れです。 その dropDups オプションは は MongoDB 3.0 で削除されました。 そのため、ほとんどの場合、別のアプローチが必要になります。例えば、上で提案されているように集約を使うことができます。 ユニークキーを追加しても、MongoDBがドキュメントを重複させる .

というのが確実な場合は source_references.key が重複したレコードを識別する場合、一意なインデックスを確保するために dropDups:true インデックス作成オプションは、MongoDB 2.6 以降で使用可能です。

db.things.ensureIndex({'source_references.key' : 1}, {unique : true, dropDups : true})

これは、各 source_references.key の値で、重複キー違反になるような後続のドキュメントは削除します。

重要なお知らせ : がないドキュメントは source_references.key フィールドがあるものとみなされます。 ヌル の値がないので、そのキーフィールドがない後続の文書は削除されます。 このとき sparse:true インデックス作成オプションを使用すると、インデックスが source_references.key フィールドがあります。

明らかな注意 : 意図しないデータ損失が心配な場合は、データベースのバックアップを取り、まずステージング環境で試してみてください。