MongoDB Update() ドキュメントと例

\

⚡ スマートサマリー

MongoDB Update() ドキュメント操作は、コレクション内の既存のレコードを変更します。update() メソッドは、ドキュメントを選択するための条件と、フィールド値を変更するための $set などの修飾子を受け取ります。また、multi オプションを使用すると、一致する複数のドキュメントを一度に更新できます。

  • 会<XNUMXxEXNUMX><XNUMXxXNUMXF>️️<XNUMXxXNUMXF>️️ update() メソッド: update() コマンドは、指定された条件に一致するドキュメント内のフィールドを変更します。
  • 🎯 試合条件: 最初の引数は、{Employeeid:1} のように、更新するドキュメントを選択します。
  • 🔧 $set Operaトール: $set演算子は、ドキュメント全体を置き換えることなく、フィールドに新しい値を割り当てます。
  • 📚 多数のアップデート: 複数オプション、つまり updateMany() は、一致するすべてのドキュメントを修正します。1 つのドキュメントだけを修正するわけではありません。
  • アップサート: upsertオプションは、条件に一致する既存の文書がない場合に、新しい文書を挿入します。
  • 🔄 現代的な方法: updateOne()、updateMany()、replaceOne() は、現在非推奨となっている update() の代替関数です。

MongoDB Update() ドキュメント

基本的なドキュメントの更新

MongoDB コレクションのドキュメントを更新するための update() コマンドを提供します。更新したいドキュメントのみを更新するには、選択したドキュメントのみが更新されるように更新ステートメントに条件を追加します。

コマンドの基本パラメータはドキュメントを更新する必要がある条件であり、次に実行する必要がある変更です。

次の例は、これを実行する方法を示しています。

ステップ1) 更新コマンドを発行します

ステップ2) どのドキュメントを更新する必要があるかを決定するために使用する条件を選択します。 この例では、従業員 ID が 22 のドキュメントを更新したいと考えています。

ステップ3) set コマンドを使用してフィールド名を変更します

ステップ4) 変更するフィールド名を選択し、それに応じて新しい値を入力します。

db.Employee.update(
{"Employeeid" : 1},
{$set: { "EmployeeName" : "NewMartin"}});

コマンドが正常に実行されると、次の出力が表示されます。

出力:

基本的なドキュメントの更新

出力には、XNUMX つのレコードが条件に一致したため、関連するフィールド値が変更されたことが明確に示されています。

MongoDB 更新 Operaトー

$set演算子はフィールドを変更する最も一般的な方法ですが、 MongoDB さまざまなニーズに対応する複数の更新演算子が用意されています。これらは、update() 関数の 2 番目の引数に、$set と並べて、または $set の代わりに指定できます。

  • $セット: フィールドの値を設定します。フィールドが存在しない場合は作成します。
  • $unset: ドキュメントからフィールドを完全に削除します。
  • $inc: 数値フィールドを指定された量だけ増減します。
  • $mul: 数値フィールドの値を乗算します。
  • $rename: フィールド名を新しい名前に変更します。
  • $push: 配列フィールドに値を追加します。
  • $pull: 配列フィールドから一致する値を削除します。

各演算子は、指定したフィールドのみを対象とし、ドキュメントの残りの部分は変更されません。複数の演算子を単一の update() 呼び出しで組み合わせることで、複数のフィールドを一度に変更でき、更新の精度を維持し、保持したいデータの上書きを防ぐことができます。

複数の値の更新

複数の/一括ドキュメントが確実に同時に更新されるようにするには MongoDB multi オプションを使用する必要があります。そうしないと、デフォルトでは一度に 1 つのドキュメントのみが変更されます。

次の例は、多数のドキュメントを更新する方法を示しています。

この例では、まず従業員 ID が「1」であるドキュメントを検索し、従業員名を「Martin」から「NewMartin」に変更します。

ステップ1) 更新コマンドを発行します

ステップ2) どのドキュメントを更新する必要があるかを決定するために使用する条件を選択します。 この例では、従業員 ID が「1」のドキュメントを更新する必要があります。

ステップ3) 変更するフィールド名を選択し、それに応じて新しい値を入力します。

db.Employee.update
(
	{
		Employeeid : 1
	},
	{
		$set :
		{
			"EmployeeName" : "NewMartin",
			"Employeeid" : 22
		}
	}
)

コマンドが正常に実行され、 "探す" 従業員IDが22の文書を検索するコマンドを実行すると、次の出力が表示されます。

出力:

複数の値の更新

出力には、XNUMX つのレコードが条件に一致したため、関連するフィールド値が変更されたことが明確に示されています。

ドキュメントをアップサートする方法 MongoDB

アップサートは更新と挿入の組み合わせです。これを有効にすると、 MongoDB 条件に一致する文書を更新するか、一致する文書が見つからない場合は新しい文書を挿入します。これは、レコードが既に存在するかどうか不明な場合に便利です。

アップサートを実行するには、update() 関数の 3 番目の引数として upsert オプションを true に設定して追加します。

db.Employee.update(
  {Employeeid: 5},
  {$set: {EmployeeName: "Sofia"}},
  {upsert: true}
)

ここで何が起こるか:

  • 従業員IDが5の文書が存在する場合、 MongoDB 従業員名フィールドを更新します。
  • そのような文書が存在しない場合、 MongoDB 従業員ID 5、従業員名「Sofi"

アップサートは、カウンター、設定、および初回使用時にレコードを作成し、その後更新したいワークフローに便利です。 MongoDB同様の動作は、updateOne() および updateMany() メソッドのオプションに {upsert: true} を渡すことで実現できます。ただし、条件には注意してください。広範囲のフィルタと upsert を組み合わせると、予期しないドキュメントが作成される可能性があるためです。

updateOne()、updateMany()、replaceOne()の比較

update() メソッドは現在、レガシー コマンドです。 MongoDB ドライバーは、その動作をより明確な3つの方法に分類しました。以下の表は、それらを比較したものです。

方法 何それがありません 影響を受ける文書
updateOne() 最初に一致した文書に更新演算子を適用します 1
updateMany() 一致するすべてのドキュメントに更新演算子を適用します その他にもたくさんのグーグルの
replaceOne() 最初に一致した文書全体を新しい文書に置き換えます 1

単一の対象を変更する場合は updateOne() を、従来の multi オプションの代わりに updateMany() を、フィールドを編集するのではなくドキュメント全体を交換する場合は replaceOne() を使用してください。これらのメソッドは、一致したドキュメントの数と変更されたドキュメントの数を明確に示す結果を返すため、update() よりも安全でデバッグが容易です。

よくあるご質問

$set のような更新演算子がない場合、 MongoDB 指定したオブジェクトで一致したドキュメント全体を置き換え、含まれていないフィールドを削除します。特定のフィールドを変更しつつ、ping 残りは無傷だった。

はい。$set で指定されたフィールドが一致したドキュメントに存在しない場合、 MongoDB 指定された値を追加します。これにより、$set は既存のフィールドの更新と新しいフィールドの追加の両方に役立ちます。

findOneAndUpdate() 関数を returnDocument オプションを 'after' に設定して使用してください。これにより、変更を適用して変更後のドキュメントを単一のアトミック操作で返すことができます。これは、新しい値をすぐに使用する必要がある場合に便利です。

AIは、単純なリクエストを、$setや$incなどの適切な条件と演算子を用いた更新コマンドまたは更新多元コマンドに変換し、各部分を説明することで、初心者が間違いを犯さないようにすることができます。

はい。AIは、$setを省略してドキュメント全体を置き換えてしまう更新を検出したり、フィルターがすべての条件に一致した場合に警告を発したり、本番環境で実行する前にコピーでテストすることを提案したりできます。