Maison > Article > développement back-end > Pourquoi est-ce que j'obtiens des documents en double dans ma collection MongoDB même après avoir créé une clé unique avec « dropDups » ?
Énoncé du problème
Malgré la création d'une collection avec une clé unique sur le " uid" et "sid", des documents en double sont toujours en cours d'insertion dans la collection.
Détails techniques
La commande de création d'index utilisée :
db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true,dropDups: true})
Cause
La création de l'index échoue en raison de la présence de documents en double dans la collection. Dans MongoDB version 3.0.0, l'option "dropDups" ne fonctionne pas correctement, ce qui entraîne ce problème.
Solution
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})
Opération Upsert
Pour la deuxième partie de la question, pour obtenir le comportement souhaité d'insertion ou de mise à jour d'un document en fonction de la présence de données existantes , utilisez la méthode ".update()" avec l'option "upsert" :
$collection->update( array( "uid" => 1, "sid" => 1 ), array( '$set' => $someData ), array( 'upsert' => true ) );
Cela modifiera les documents trouvés et insérera de nouveaux documents si nécessaire. De plus, vous pouvez utiliser "$setOnInsert" pour spécifier les champs qui ne doivent être définis que lors de l'insertion du document.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!