.bulkWrite()
が必要です
このため。これは実際には単一の操作ではないため、単一のリクエストで複数の操作を送信する必要があります。基本的に、 $set
を使用して更新を書き込もうとします。
データが存在する場所、または $push
存在しない新しいデータ:
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" } }
}
}}
])
肯定的なケースは単に値であり、 $ne
等式一致を「否定」します。つまり、アイテムは存在しません。もちろん、位置$
オペレーター
$set
とともに使用されます
どこにあるのか
データが与えられると、「バッチ」で2つの操作が送信されても、実際には1つの操作のみが一致し、更新として適用されます。
ドキュメント全体にも「アップサート」が必要な場合は、その最後に別の操作を追加する必要があります。他のステートメント、特に $ne
これは、_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
"upsert"
としてマークされているのは最後の操作だけですが、ここでの主なヘルプです。 。この組み合わせにより、プライマリ「ドキュメント」が見つかった場所では実際には何も起こりませんが、見つからない場合は新しい配列アイテムが追加されます。
補足として、数値を文字列ではなく数値として実際に格納することを強くお勧めします。ほとんどの場合、スペースを節約できるだけでなく、その方がはるかに便利です。