Bạn muốn .bulkWrite()
cho điều này. Đây thực sự không phải là một thao tác đơn lẻ, vì vậy bạn muốn gửi nhiều thao tác trong một yêu cầu duy nhất. Về cơ bản, hãy cố gắng viết bản cập nhật bằng $set
nơi dữ liệu tồn tại hoặc $push
dữ liệu mới không tồn tại:
db.collection.bulkWrite([
{ "updateOne": {
"filter": { "_id": "1", "option.weight": "10" },
"update": {
"$set": { "option.$.price": "30" }
}
}},
{ "updateOne": {
"filter": { "_id": "1", "option.weight": { "$ne": "10" } },
"update": {
"$push": { "option": { "weight": "10", "price": "30" } }
}
}}
])
Trường hợp khẳng định chỉ đơn giản là giá trị và $ne
"phủ định" đối sánh bình đẳng, có nghĩa là mục không tồn tại. Tất nhiên, vị trí $
nhà điều hành
được sử dụng với $set
nó ở đâu
Với dữ liệu, chỉ một trong các hoạt động sẽ thực sự khớp và áp dụng như một bản cập nhật mặc dù hai hoạt động được gửi trong "lô".
Nếu bạn cũng muốn "uperts" cho toàn bộ tài liệu, thì bạn cần thêm một thao tác khác vào cuối thao tác đó. Lưu ý rằng bạn không thể áp dụng "upert" làm tùy chọn cho một trong các câu lệnh khác, đặc biệt là $ne
bởi vì điều đó sẽ tạo ra một tài liệu mới trong đó mục mảng không tồn tại, không chỉ _id
:
db.collection.bulkWrite([
{ "updateOne": {
"filter": { "_id": "1", "option.weight": "10" },
"update": {
"$set": { "option.$.price": "30" }
}
}},
{ "updateOne": {
"filter": { "_id": "1", "option.weight": { "$ne": "10" } },
"update": {
"$push": { "option": { "weight": "10", "price": "30" } }
}
}},
{ "updateOne": {
"filter": { "_id": 1 },
"update": {
"$setOnInsert": {
"option": [
{ "weight": "10", "price": "30" }
]
}
},
"upsert": true
}}
])
$setOnInsert
là trợ giúp chính ở đây ngoài thao tác cuối cùng được đánh dấu duy nhất là "upsert"
. Sự kết hợp đó đảm bảo rằng nơi tìm thấy "tài liệu" chính thì không có gì thực sự xảy ra, nhưng khi không tìm thấy, mục mảng mới sẽ được thêm vào.
Lưu ý thêm, tôi thực sự khuyên bạn nên lưu trữ các giá trị số thực sự dưới dạng số thay vì chuỗi. Nó không chỉ tiết kiệm dung lượng trong hầu hết các trường hợp mà còn hữu ích hơn nhiều theo cách đó.