Mirip dengan pertanyaan Anda sebelumnya
, Anda menggunakan .bulkWrite()
tetapi karena pemilihan elemen array memiliki "beberapa kondisi", ini adalah tempat Anda menggunakan $elemMatch
:
db.collection.bulkWrite([
{ "updateOne": {
"filter": {
"_id": "1",
"option": {
"$elemMatch": { "weight": "40", "size": "40" }
}
},
"update": {
"$set": { "option.$.price": "300" }
}
}},
{ "updateOne": {
"filter": {
"_id": "1",
"option": {
"$not": {
"$elemMatch": { "weight": "40", "size": "40" }
}
}
},
"update": {
"$push": { "option": { "weight": "40", "size": "40", "price": "300" } }
}
}},
{ "updateOne": {
"filter": { "_id": 1 },
"update": {
"$setOnInsert": {
"option": [
{ "weight": "40", "size": "40", "price": "300" }
]
}
},
"upsert": true
}}
])
Jadi operasinya adalah:
-
Uji apakah elemen array cocok dengan kondisi di
$elemMatch
ada dan kemudian$set
nilai yang cocok. -
Uji elemen array adalah
$not
hadir dalam negasi. Anda dapat menggunakan$ne
secara bergantian di setiap properti, tetapi meniadakan kondisi di mana keduanya cocok sedikit lebih bersih."$elemMatch": { "weight": { "$ne": "40" }, "size": { "$ne": "40" } }
Bagaimanapun Anda
$push
elemen array baru ketika salah satu tidak cocok dengan kriteria yang disediakan ditemukan. -
Coba "upsert" hanya jika dokumen utama
_id
tidak ditemukan, dan gunakan$setOnInsert
sehingga jika dokumen ditemukan, operasi ini tidak melakukan apa-apa.
Sama seperti sebelumnya, hanya satu dari ini yang benar-benar akan menulis apa pun meskipun seluruh batch dikirim ke server.