ホームページ  >  記事  >  バックエンド開発  >  「dropDups」で一意のキーを作成した後でも、MongoDB コレクションに重複したドキュメントが表示されるのはなぜですか?

「dropDups」で一意のキーを作成した後でも、MongoDB コレクションに重複したドキュメントが表示されるのはなぜですか?

DDD
DDDオリジナル
2024-11-04 07:10:311065ブラウズ

Why Am I Getting Duplicate Documents in My MongoDB Collection Even After Creating a Unique Key with `dropDups`?

一意のキーを追加した後の MongoDB のドキュメントの重複

問題ステートメント

「 uid" および "sid" フィールドでは、重複したドキュメントがまだコレクションに挿入されています。

技術的な詳細

使用されるインデックス作成コマンド:

db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})

原因

コレクション内に重複したドキュメントが存在するため、インデックスの作成が失敗します。 MongoDB バージョン 3.0.0 では、「dropDups」オプションが正しく機能しないため、この問題が発生します。

解決策

  • 重複したドキュメントを削除する: これを解決するには、一意のインデックスを作成する前に重複したドキュメントを削除します。これは、集計クエリと削除クエリを使用して実現できます。
db.events.aggregate([
    { "$group": {
        "_id": { "uid": "$uid", "sid": "$sid" },
        "dups": { "$push": "$_id" },
        "count": { "$sum": 1 }
    }},
    { "$match": { "count": { "$gt": 1 } }}
]).forEach(function(doc) {
    doc.dups.shift();
    db.events.remove({ "_id": {"$in": doc.dups }});
});
  • 一意のインデックスを作成します: 重複を削除した後、意図したとおりに一意のインデックスを作成します。
db.events.createIndex({"uid":1 , "sid": 1},{unique:true})

Upsert 操作

質問の 2 番目の部分では、既存のデータの存在に基づいてドキュメントを挿入または更新するという望ましい動作を実現します。 、「upsert」オプションを指定して「.update()」メソッドを使用します。

$collection->update(
    array( "uid" => 1, "sid" => 1 ),
    array( '$set' => $someData ),
    array( 'upsert' => true )
);

これにより、必要に応じて、見つかったドキュメントが変更され、新しいドキュメントが挿入されます。さらに、「$setOnInsert」を使用して、ドキュメントの挿入時にのみ設定するフィールドを指定できます。

以上が「dropDups」で一意のキーを作成した後でも、MongoDB コレクションに重複したドキュメントが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。