Maison  >  Article  >  développement back-end  >  Pourquoi est-ce que je vois toujours des documents en double dans MongoDB malgré l'utilisation d'un index unique ?

Pourquoi est-ce que je vois toujours des documents en double dans MongoDB malgré l'utilisation d'un index unique ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-28 15:47:02611parcourir

Why Am I Still Seeing Duplicate Documents in MongoDB Despite Using a Unique Index?

Documents en double MongoDB malgré une clé unique

Dans MongoDB, la création d'un index unique sur plusieurs champs devrait empêcher les documents en double avec les mêmes valeurs pour ceux-ci champs. Cependant, dans certains cas, des documents en double peuvent encore être insérés même après l'ajout d'un index.

Problème :

Un index unique a été créé sur "uid" et " sid" dans une collection, mais les documents avec des valeurs en double pour ces champs étaient toujours insérés à l'aide du pilote PHP.

Solution :

MongoDB Shell

  1. Vérifier les doublons existants :

    • Exécutez la requête suivante pour identifier les documents en double existants :
    db.user_services.aggregate([
        { "$group": {
            "_id": { "uid": "$uid", "sid": "$sid" },
            "dups": { "$push": "$_id" },
            "count": { "$sum": 1 }
        }},
        { "$match": { "count": { "$gt": 1 } }}
    ])
  2. Supprimer les doublons :

    • Pour chaque document identifié comme doublon, supprimez tous les documents sauf le premier (original) :
    db.user_services.remove({ "_id": {"$in": doc.dups }});
  3. Créer un index unique :

    • Une fois tous les doublons supprimés, créez l'index unique à l'aide de la commande suivante :
    db.user_services.createIndex({"uid":1 , "sid": 1},{unique:true})

PHP

  1. Utiliser la mise à jour avec Upsert :

    • Au lieu d'utiliser .insert(), passez à 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>
  2. Gérer plusieurs mises à jour :

    • Refactoriser la requête de mise à jour pour gérer correctement plusieurs opérations de mise à jour :
    <code class="php">$collection->update(
        array( "uid" => 1, "sid" => 1 ),
        array(
            '$set' => array( "field" => "this" ),
            '$inc' => array( "counter" => 1 ),
            '$setOnInsert' => array( "newField" => "another" )
        ),
        array( "upsert" => true )
    );</code>

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