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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 11:07:02974ブラウズ

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

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

MongoDB でコレクションを作成し、createIndex({"uid":1 , "sid": 1 を使用して一意のインデックスを追加する場合) },{unique:true,dropDups: true})、一意キー制約にもかかわらず、重複したドキュメントがまだ挿入されているように見える場合があります。

MongoDB シェルの解決

インデックスの作成を調べると、 「重複キーエラー」を示すエラーメッセージが表示される可能性があります。これは、MongoDB 3.0.0 に重複が存在する場合にインデックスを作成できないバグがあったためです。

これを解決するには、まず集計クエリと $match 演算子を使用して重複レコードを削除します。

<code class="javascript">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 }});
});</code>

重複が削除されると、エラーが発生することなく一意のインデックスを作成できます。

PHP ソリューション

まだ存在しないドキュメントを挿入したり、既存のドキュメントを更新するには、upsert オプションを true に設定して update() メソッドを使用します。

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

これにより、ドキュメントが存在しない場合は挿入され、存在しない場合は、$set 配列で指定されたフィールドを設定することによってドキュメントが更新されます。

追加の考慮事項

  • で使用されるdropDups オプションMongoDB 3.0.0 では、初期インデックス作成は利用できなくなりました。
  • .update() メソッドの構文には、「query」、「update」、「options」の 3 つの引数が必要です。
  • 「更新」ドキュメント内の更新操作では、同じパスに複数回アクセスしてはなりません。

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

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