問題ステートメント
「 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 サイトの他の関連記事を参照してください。