sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo determinar si $addToSet realmente agregó un nuevo elemento a un documento MongoDB o si el elemento ya existía?

Por supuesto, lo que está haciendo aquí es verificar la respuesta que indica si un documento se actualizó o insertó o, de hecho, si no ocurrió ninguna operación. Ese es su mejor indicador en cuanto a un $addToSet de haber realizado una actualización, el documento se actualizaría.

El $addToSet El operador en sí no puede producir duplicados, esa es la naturaleza del operador. Pero es posible que tenga algunos problemas con su lógica:

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

Claramente, está mostrando que un elemento en su "conjunto" se compone de dos campos, por lo que si ese contenido varía de alguna manera (es decir, la misma identificación pero un valor diferente), entonces el elemento es en realidad un miembro "único" del conjunto y ser agregado. No habría manera, por ejemplo, para el $addToSet operador para no agregar nuevos valores basados ​​puramente en el "id" como un identificador único. Tendrías que incluir eso en el código.

Una segunda posibilidad aquí para una forma de duplicado es que la parte de su consulta no encuentra correctamente el documento que debe actualizarse. El resultado de esto sería crear un nuevo documento que contenga solo el miembro recién especificado en el "conjunto". Entonces, un error de uso común es algo como esto:

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

El resultado de ese tipo de operación siempre crearía un nuevo documento porque el documento existente no contenía el elemento especificado en el "conjunto". La implementación correcta es no verificar la presencia del miembro "conjunto" y permitir $addToSet para hacer el trabajo.

Si de hecho tiene verdadero entradas duplicadas que ocurren en el "conjunto" donde todos los elementos del subdocumento son exactamente iguales, entonces ha sido causado por algún otro código presente o en el pasado.

Cuando esté seguro de que se están creando nuevas entradas, busque en el código instancias de $push o, de hecho, y la manipulación de matrices en el código que parece estar actuando en el mismo campo.

Pero si está utilizando el operador correctamente, entonces $addToSet hace exactamente lo que debe hacer.