Maison > développement back-end > tutoriel php > 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
Libérer: 2024-11-04 07:10:31
original
1081 Les gens l'ont consulté

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})
Copier après la connexion

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 }});
});
Copier après la connexion
  • 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})
Copier après la connexion

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 )
);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal