MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment déterminer si $addToSet a réellement ajouté un nouvel élément dans un document MongoDB ou si l'élément existait déjà ?

Bien sûr, ce que vous faites ici est en fait de vérifier la réponse qui indique si un document a été mis à jour ou inséré ou en fait si aucune opération ne s'est produite. C'est votre meilleur indicateur pour un $addToSet pour avoir effectué une mise à jour le document serait alors mis à jour.

Le $addToSet l'opérateur lui-même ne peut pas produire de doublons, c'est la nature de l'opérateur. Mais vous pouvez en effet avoir quelques problèmes avec votre logique :

{                                                
      "$addToSet", new BsonDocument()
           {
                { "items", new BsonDocument()
                     {
                          { "id", item.Id },
                          { "v", item.Value } 
                     }
                }
           }
 }

Donc, clairement, vous montrez qu'un élément de votre "ensemble" est composé de deux champs, donc si ce contenu varie de quelque manière que ce soit (c'est-à-dire le même identifiant mais une valeur différente), l'élément est en fait un membre "unique" de l'ensemble et sera être ajouté. Il n'y aurait aucun moyen par exemple pour le $addToSet opérateur pour ne pas ajouter de nouvelles valeurs purement basées sur "id" en tant qu'identifiant unique. Vous devriez en fait rouler cela dans le code.

Une deuxième possibilité ici pour une forme de doublon est que votre partie de requête ne trouve pas correctement le document qui doit être mis à jour. Le résultat serait la création d'un nouveau document contenant uniquement le membre nouvellement spécifié dans "l'ensemble". Donc, une erreur d'utilisation courante ressemble à ceci :

db.collection.update(
    { 
        "id": ABC,
        "items": { "$elemMatch": {
            "id": 123, "v": 10
         }},
    {
        "$addToSet": {
            "items": {
                "id": 123, "v": 10
            }
        }
    },
    { "upsert": true }
)

Le résultat de ce type d'opération créerait toujours un nouveau document car le document existant ne contenait pas l'élément spécifié dans le "set". La mise en œuvre correcte consiste à ne pas vérifier la présence du membre "set" et autoriser $addToSet faire le travail.

Si en effet vous avez true entrées en double apparaissant dans "l'ensemble" où tous les éléments du sous-document sont exactement les mêmes, cela a été causé par un autre code présent ou dans le passé.

Lorsque vous êtes sûr qu'une nouvelle entrée est créée, recherchez dans le code des instances de $push ou bien et manipulation de tableau dans du code qui semble agir sur le même champ.

Mais si vous utilisez correctement l'opérateur, alors $addToSet fait exactement ce pour quoi il est destiné.