Para este tipo de operação você não deve usar
$addToSet
já que, claro, o $inc
aconteceria independentemente de algo ter sido adicionado ao array ("set" ) ou não. Em vez disso, teste os arrays com o
$ne
operador na consulta:db.collection.update(
{ "unique_array": { "$ne": 18 } }, <-- existing element
{
"$push": { "unique_array": 18 },
"$inc": { "size_of_array": 1 }
}
)
O mesmo vale para remover membros do array, mas é claro que desta vez você testa a presença com igualdade:
db.collection.update(
{ "unique_array": 18 }, <-- existing element
{
"$pull": { "unique_array": 18 },
"$inc": { "size_of_array": -1 }
}
)
Como a condição da consulta precisa corresponder, se o elemento da matriz já estiver presente ao adicionar, não haverá correspondência e nem
$push
ou $inc
operações são executadas. E o mesmo vale para o $pull
caso em que o elemento não está presente na matriz.