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

Susan Sarandon
Libérer: 2024-10-28 15:47:02
original
607 Les gens l'ont consulté

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

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

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!