MongoDB $setOnInsert
フィールド更新演算子を使用して、アップサート中に特定の値を挿入できます。
更新操作の結果、新しいドキュメントが挿入される場合(つまり、アップサート)、$setOnInsert
演算子が有効になります。それ以外の場合は効果がありません。
例
dogs
というコレクションがあるとします。 次のドキュメントで:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 }
そして、次のupdate()
を実行します コレクションに存在しないドキュメントを更新するコマンド:
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 50, height: 40 },
$setOnInsert: { name: "Bark" }
},
{ upsert: true }
)
これにより、次の出力が生成されます。
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
これは、1つのドキュメントがアップサートされたことを示しています。
コレクションを確認しましょう:
db.dogs.find()
結果:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 40, "name" : "Bark", "weight" : 50 }
ドキュメント2が挿入されており、$setOnInsert
に指定したフィールド/値が含まれていることがわかります。 演算子(例:name: "Bark"
。
ドキュメントが存在する場合(つまり、アップサートなし)
次に、アップサートしたばかりのドキュメントを更新してみましょう。前の例と同じステートメントを使用しますが、値は異なります。
db.dogs.update(
{ _id: 2 },
{
$set: { weight: 55, height: 45 },
$setOnInsert: { name: "Fluffy" }
},
{ upsert: true }
)
出力:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
今回は、1つのドキュメントが一致して更新されました。何も支持されませんでした。
コレクションをもう一度確認しましょう。
db.dogs.find()
結果:
{ "_id" : 1, "name" : "Wag", "weight" : 11, "height" : 30 } { "_id" : 2, "height" : 45, "name" : "Bark", "weight" : 55 }
したがって、この場合、weight
およびheight
フィールドは更新されましたが、name
フィールドはそうではありませんでした。
名前フィールドが更新されなかった理由は、アップサートが実行されていなかったためです。 $setOnInsert
演算子は、更新操作によって新しいドキュメントが挿入された場合(つまり、アップサート)に設定されるフィールド/値のみを指定します。