MongoDB では一意のキーにもかかわらずドキュメントが重複する
MongoDB では、複数のフィールドに一意のインデックスを作成すると、それらのフィールドに同じ値を持つドキュメントの重複を防ぐことができます。フィールド。ただし、場合によっては、インデックスを追加した後でも重複したドキュメントが挿入されることがあります。
問題:
「uid」と「」に一意のインデックスが作成されました。 sid" フィールドがコレクションに含まれていますが、これらのフィールドに重複する値を持つドキュメントは依然として PHP ドライバーを使用して挿入されていました。
解決策:
MongoDB Shell
既存の重複の確認:
db.user_services.aggregate([ { "$group": { "_id": { "uid": "$uid", "sid": "$sid" }, "dups": { "$push": "$_id" }, "count": { "$sum": 1 } }}, { "$match": { "count": { "$gt": 1 } }} ])
重複の削除:
db.user_services.remove({ "_id": {"$in": doc.dups }});
一意のインデックスの作成:
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true})
PHP
Upsert による更新を使用する:
<code class="php">$collection->update( array( "uid" => 1, "sid" => 1 ), array( '$set' => $someData ), array( 'upsert' => true ) );</code>
複数の更新の処理:
<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 サイトの他の関連記事を参照してください。