前の質問
と同様です 、 .bulkWrite()
を使用します
ただし、配列要素の選択には「複数の条件」があるため、ここでを使用します。 $ 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
}}
])
したがって、操作は次のとおりです。
-
$ elemMatch
> が存在し、$ set
一致した値。 -
配列要素が
$ not
であることをテストします 否定で存在します。または、$ ne
を使用することもできます。 各プロパティで、ただし、両方が一致する条件を否定すると、少しクリーンになります。"$elemMatch": { "weight": { "$ne": "40" }, "size": { "$ne": "40" } }
とにかく、
$ push
ない場合の新しい配列要素 提供された基準に一致するものが見つかりました。 -
プライマリドキュメント
_id
でのみ「アップサート」を試行します が見つかりません。$ setOnInsert
を使用してください そのため、ドキュメントが見つかった場合、この操作は何もしません。
以前と同じように、バッチ全体がサーバーに送信されても、実際に何かを書き込むのはそのうちの1つだけです。