Không biết bạn đã thử gì vì đơn giản là nó không được bao gồm trong câu hỏi của bạn, nhưng cách tốt nhất để kiểm tra một mảng trống về cơ bản là xem nơi 0
chỉ mục không khớp với $exists
:
Inventory.update(
{ "products.rates.0": { "$exists": false } },
{
"$pull": {
"products": { "rates.0": { "$exists": false } }
}
},
{ "multi": true },
function(err,numAffected) {
}
)
Phần "truy vấn" của .update()
tuyên bố đảm bảo rằng chúng tôi thậm chí chỉ cố gắng chạm vào tài liệu có mảng trống trong "products.rates"
. Điều đó không bắt buộc, nhưng nó tránh kiểm tra điều kiện câu lệnh "cập nhật" sau trên các tài liệu mà điều kiện đó không phải là true
cho bất kỳ phần tử mảng nào và do đó làm cho mọi thứ nhanh hơn một chút.
Phần "cập nhật" thực tế áp dụng $pull
trên "products"
mảng để loại bỏ bất kỳ mục nào trong đó "rates"
"bên trong" là một mảng trống. Vì vậy, "đường dẫn" trong $pull
thực sự đang xem xét bên trong "products"
nội dung, vì vậy nó liên quan đến nội dung đó chứ không phải toàn bộ tài liệu.
Đương nhiên $pull
sẽ xóa tất cả các phần tử phù hợp trong một thao tác. "multi"
chỉ cần thiết khi bạn thực sự muốn cập nhật nhiều tài liệu với câu lệnh