Für diese Art von Operation sollten Sie nicht $addToSet
da natürlich der $inc
würde unabhängig davon passieren, ob dem Array etwas hinzugefügt wurde ("set" ) oder nicht.
Testen Sie die Arrays stattdessen mit $ne
Operator in der Abfrage:
db.collection.update(
{ "unique_array": { "$ne": 18 } }, <-- existing element
{
"$push": { "unique_array": 18 },
"$inc": { "size_of_array": 1 }
}
)
Dasselbe gilt für das Entfernen von Array-Mitgliedern, aber dieses Mal testen Sie natürlich mit Gleichheit auf das Vorhandensein:
db.collection.update(
{ "unique_array": 18 }, <-- existing element
{
"$pull": { "unique_array": 18 },
"$inc": { "size_of_array": -1 }
}
)
Da die Abfragebedingung übereinstimmen muss, wenn das Array-Element beim Hinzufügen bereits vorhanden war, gibt es keine Übereinstimmung und auch nicht den $push
oder $inc
Operationen laufen. Und dasselbe gilt für $pull
Fall, in dem das Element nicht im Array vorhanden ist.