Đối với loại thao tác này, bạn không nên sử dụng $ addToSet
vì tất nhiên là $ inc
sẽ xảy ra bất kể có bất kỳ thứ gì được thêm vào mảng ("set") hay không.
Thay vào đó, hãy kiểm tra các mảng với $ ne
toán tử trong truy vấn:
db.collection.update(
{ "unique_array": { "$ne": 18 } }, <-- existing element
{
"$push": { "unique_array": 18 },
"$inc": { "size_of_array": 1 }
}
)
Điều tương tự cũng xảy ra đối với việc xóa các thành viên mảng, nhưng tất nhiên lần này bạn kiểm tra sự hiện diện bằng sự bình đẳng:
db.collection.update(
{ "unique_array": 18 }, <-- existing element
{
"$pull": { "unique_array": 18 },
"$inc": { "size_of_array": -1 }
}
)
Vì điều kiện truy vấn cần phải khớp, nếu phần tử mảng đã có mặt khi thêm thì sẽ không có kết quả phù hợp và netiher là $ push
hoặc $ inc
các hoạt động được chạy. Và điều này cũng đúng với $ pull
trường hợp phần tử không có trong mảng.