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 演算子は、更新操作によって新しいドキュメントが挿入された場合(つまり、アップサート)に設定されるフィールド/値のみを指定します。