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

Agregue Único solo a la matriz y mantenga el recuento de campos en la actualización

Para este tipo de operación no debe usar $addToSet ya que por supuesto el $inc ocurriría independientemente de si se agregó algo a la matriz ("set") o no.

En su lugar, pruebe las matrices con $ne operador en la consulta:

db.collection.update(
    { "unique_array": { "$ne": 18 } },    <-- existing element
    { 
        "$push": { "unique_array": 18 },
        "$inc": { "size_of_array": 1 }
    }
)

Lo mismo ocurre con la eliminación de miembros de la matriz, pero, por supuesto, esta vez prueba la presencia con igualdad:

db.collection.update(
    { "unique_array": 18 },    <-- existing element
    { 
        "$pull": { "unique_array": 18 },
        "$inc": { "size_of_array": -1 }
    }
)

Dado que la condición de consulta debe coincidir, si el elemento de la matriz ya estaba presente cuando se agregó, entonces no hay coincidencia y tampoco $push o $inc se ejecutan las operaciones. Y lo mismo ocurre con el $pull caso donde el elemento no está presente en la matriz.