MongoDB でコレクションを作成し、createIndex({"uid":1 , "sid": 1 を使用して一意のインデックスを追加する場合) },{unique:true,dropDups: true})、一意キー制約にもかかわらず、重複したドキュメントがまだ挿入されているように見える場合があります。
インデックスの作成を調べると、 「重複キーエラー」を示すエラーメッセージが表示される可能性があります。これは、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>
重複が削除されると、エラーが発生することなく一意のインデックスを作成できます。
まだ存在しないドキュメントを挿入したり、既存のドキュメントを更新するには、upsert オプションを true に設定して update() メソッドを使用します。
<code class="php">$collection->update( array( "uid" => 1, "sid" => 1 ), array( '$set' => $someData ), array( 'upsert' => true ) );</code>
これにより、ドキュメントが存在しない場合は挿入され、存在しない場合は、$set 配列で指定されたフィールドを設定することによってドキュメントが更新されます。
以上が一意のインデックスがあるにもかかわらず、MongoDB で重複ドキュメントが依然として表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。