ホームページ > バックエンド開発 > PHPチュートリアル > 一意のインデックスを使用しているにもかかわらず、MongoDB で重複ドキュメントが依然として表示されるのはなぜですか?

一意のインデックスを使用しているにもかかわらず、MongoDB で重複ドキュメントが依然として表示されるのはなぜですか?

Susan Sarandon
リリース: 2024-10-28 15:47:02
オリジナル
701 人が閲覧しました

Why Am I Still Seeing Duplicate Documents in MongoDB Despite Using a Unique Index?

MongoDB では一意のキーにもかかわらずドキュメントが重複する

MongoDB では、複数のフィールドに一意のインデックスを作成すると、それらのフィールドに同じ値を持つドキュメントの重複を防ぐことができます。フィールド。ただし、場合によっては、インデックスを追加した後でも重複したドキュメントが挿入されることがあります。

問題:

「uid」と「」に一意のインデックスが作成されました。 sid" フィールドがコレクションに含まれていますが、これらのフィールドに重複する値を持つドキュメントは依然として PHP ドライバーを使用して挿入されていました。

解決策:

MongoDB Shell

  1. 既存の重複の確認:

    • 次のクエリを実行して、既存の重複ドキュメントを特定します:
    db.user_services.aggregate([
        { "$group": {
            "_id": { "uid": "$uid", "sid": "$sid" },
            "dups": { "$push": "$_id" },
            "count": { "$sum": 1 }
        }},
        { "$match": { "count": { "$gt": 1 } }}
    ])
    ログイン後にコピー
  2. 重複の削除:

    • 重複として識別された各ドキュメントについて、最初の (元の) ドキュメントを除くすべてのドキュメントを削除します:
    db.user_services.remove({ "_id": {"$in": doc.dups }});
    ログイン後にコピー
  3. 一意のインデックスの作成:

    • すべての重複が削除されたら、次のコマンドを使用して一意のインデックスを作成します。 :
    db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true})
    ログイン後にコピー

PHP

  1. Upsert による更新を使用する:

    • .insert() を使用する代わりに、「upsert」オプションを true に設定した .update() メソッドの使用に切り替えます。
    <code class="php">$collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array( '$set' => $someData ),
        array( 'upsert' => true )
    );</code>
    ログイン後にコピー
  2. 複数の更新の処理:

    • 複数の更新操作を正しく処理するために更新クエリをリファクタリングします:
    <code class="php">$collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array(
            '$set' => array( "field" => "this" ),
            '$inc' => array( "counter" => 1 ),
            '$setOnInsert' => array( "newField" => "another" )
        ),
        array( "upsert" => true )
    );</code>
    ログイン後にコピー

以上が一意のインデックスを使用しているにもかかわらず、MongoDB で重複ドキュメントが依然として表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート