Maison > Article > développement back-end > Pourquoi est-ce que je vois toujours des documents en double dans MongoDB malgré un index unique ?
Lors de la création d'une collection dans MongoDB et de l'ajout d'un index unique à l'aide de createIndex({"uid":1 , "sid": 1 },{unique:true,dropDups:true}), il peut sembler que des documents en double soient toujours insérés malgré la clé unique contrainte.
Lors de l'examen de la création de l'index, un message d'erreur indiquant « erreur de clé en double » est probablement rencontré. En effet, MongoDB 3.0.0 présentait un bug qui empêchait la création de l'index en cas de doublons.
Pour résoudre ce problème, supprimez d'abord les enregistrements en double à l'aide d'une requête agrégée et de l'opérateur $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>
Une fois les doublons supprimés, l'index unique peut être créé sans rencontrer d'erreur.
Pour insérer des documents qui n'existent pas déjà ou mettre à jour des documents existants, utilisez la méthode update() avec l'option upsert définie sur true.
<code class="php">$collection->update( array( "uid" => 1, "sid" => 1 ), array( '$set' => $someData ), array( 'upsert' => true ) );</code>
Cela insérera le document s'il n'existe pas, sinon il mettra à jour le document en définissant les champs spécifiés dans le tableau $set.
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!