W przypadku tego typu operacji nie należy używać $addToSet
ponieważ oczywiście $inc
stanie się niezależnie od tego, czy coś zostało dodane do tablicy ( "set" ), czy nie.
Zamiast tego przetestuj tablice za pomocą $ne
operator w zapytaniu:
db.collection.update(
{ "unique_array": { "$ne": 18 } }, <-- existing element
{
"$push": { "unique_array": 18 },
"$inc": { "size_of_array": 1 }
}
)
To samo dotyczy usuwania członków tablicy, ale oczywiście tym razem testujesz obecność z równością:
db.collection.update(
{ "unique_array": 18 }, <-- existing element
{
"$pull": { "unique_array": 18 },
"$inc": { "size_of_array": -1 }
}
)
Ponieważ warunek zapytania musi być zgodny, jeśli element tablicy był już obecny podczas dodawania, nie ma dopasowania, a ponadto $push
lub $inc
prowadzone są operacje. To samo dotyczy $pull
przypadek, w którym element nie jest obecny w tablicy.