Pour ce type d'opération, vous ne devez pas utiliser $addToSet
puisque bien sûr le $inc
se produirait indépendamment du fait que quelque chose ait été ajouté au tableau ( "set" ) ou non.
Au lieu de cela, testez les tableaux avec le $ne
opérateur dans la requête :
db.collection.update(
{ "unique_array": { "$ne": 18 } }, <-- existing element
{
"$push": { "unique_array": 18 },
"$inc": { "size_of_array": 1 }
}
)
Il en va de même pour la suppression des membres du tableau, mais bien sûr cette fois, vous testez la présence avec égalité :
db.collection.update(
{ "unique_array": 18 }, <-- existing element
{
"$pull": { "unique_array": 18 },
"$inc": { "size_of_array": -1 }
}
)
Étant donné que la condition de requête doit correspondre, si l'élément de tableau était déjà présent lors de l'ajout, il n'y a pas de correspondance et pas de $push
ou $inc
les opérations sont exécutées. Et il en va de même pour le $pull
cas où l'élément n'est pas présent dans le tableau.