Pro tento typ operace byste neměli používat $addToSet
protože samozřejmě $inc
by se stalo bez ohledu na to, zda bylo do pole ( "set" ) něco přidáno nebo ne.
Místo toho otestujte pole pomocí $ne
operátor v dotazu:
db.collection.update(
{ "unique_array": { "$ne": 18 } }, <-- existing element
{
"$push": { "unique_array": 18 },
"$inc": { "size_of_array": 1 }
}
)
Totéž platí pro odstranění členů pole, ale tentokrát samozřejmě otestujete přítomnost pomocí rovnosti:
db.collection.update(
{ "unique_array": 18 }, <-- existing element
{
"$pull": { "unique_array": 18 },
"$inc": { "size_of_array": -1 }
}
)
Vzhledem k tomu, že podmínka dotazu se musí shodovat, pokud byl prvek pole již přítomen při přidávání, nedochází k žádné shodě a není k dispozici $push
nebo $inc
operace jsou spuštěny. A totéž platí pro $pull
případ, kdy prvek není v poli přítomen.