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 » ?

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 » ?

DDD
DDDoriginal
2024-11-04 07:10:311063parcourir

Why Am I Getting Duplicate Documents in My MongoDB Collection Even After Creating a Unique Key with `dropDups`?

Documents en double MongoDB après l'ajout d'une clé unique

É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

  • Supprimer les documents en double : Pour résoudre ce problème, supprimez les documents en double avant de créer l'index unique. Ceci peut être réalisé à l'aide de requêtes d'agrégation et de suppression.
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 }});
});
  • Créez l'index unique : Après avoir supprimé les doublons, créez l'index unique comme prévu.
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn