MongoDB に存在しない場合はレコードを挿入する

Tahseen Tauseef 2024年2月15日
  1. MongoDB のUpsert
  2. MongoDB の findAndModify() メソッドによる Upsert
  3. MongoDB の update() メソッドによる Upsert
  4. MongoDB の演算子式によるUpsert
  5. MongoDB で置換ドキュメントを使用した Upsert
  6. MongoDB の集約パイプラインを使用したUpsert
  7. MongoDB のドット付き _id クエリによる Upsert
MongoDB に存在しない場合はレコードを挿入する

この記事では、MongoDB コレクションへのレコードの挿入について簡単に説明します。 これらのレコードを挿入するさまざまな方法についても説明します。

さらに、Upsert$setOninsert についても簡単に説明します。

MongoDB のUpsert

Upsert は、MongoDB のオプションで、update() や findAndModify() などの更新操作に使用されます。 言い換えれば、 upsert は update と insert を組み合わせたもの (update + insert = upsert ) です。

オプションの値が true で、指定されたクエリに一致するドキュメントが識別された場合、更新アクションは一致したドキュメントを更新します。 あるいは、このオプションの値が true で、提供されたドキュメントと一致するドキュメントがないとします。

その場合、このオプションは、操作で指定されたフィールドを使用して、コレクション内に新しいドキュメントを作成します。 upsert 操作オプションの値は、デフォルトでは false です。

共有コレクションの upsert 値が true の場合、フィルターに完全な共有キーを含める必要があります。

構文:

upsert: <boolean>

upsert オプションの値は true または false です。

ここで、upsert オプションの使用法を学習します。

MongoDB の findAndModify() メソッドによる Upsert

findAndModify() 関数では、upsert オプションを利用できます。 このメソッドのこのオプションのデフォルト値は false です。

このオプションの値を true に設定すると、プロシージャは次の操作のいずれかを実行します。

  1. 特定のクエリ条件に一致するドキュメントが見つかった場合、findAndModify() メソッドはドキュメントを更新します。
  2. 指定されたクエリ条件に一致するドキュメントがない場合、findAndModify() メソッドは新しいドキュメントをコレクションに挿入します。

構文:

db.Collection_name.findAndModify(
{
selection_criteria:<document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>,
bypassDocumentValidation: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>,  ]
})

upsert オプションの値を true に調整すると、新しいドキュメントが employee コレクションに挿入されます。

db.employee.findAndModify({query:{name:"Ram"},
                            update:{$set:{department:"Development"}},
                            upsert:true})

ここで、upsert オプションの値は true に設定されています。 Ram という名前に一致するドキュメントがないため、findAndModify() メソッドは 2つのフィールド (name: "Ram"department: "Development") を持つ新しいドキュメントを挿入します。

findandmodify メソッド

MongoDB の update() メソッドによる Upsert

update() 関数では、upsert オプションを利用できます。 この関数のこのパラメーターのデフォルト値は false です。

このオプションの値を true に設定すると、プロシージャは次のいずれかを実行します。

  1. 指定されたクエリ条件に一致するドキュメントが見つかった場合、update() メソッドがドキュメントを更新します。
  2. 指定されたクエリ基準を満たすドキュメントがない場合、update() 関数は新しいドキュメントをコレクションに追加します。

名前フィールドに一意のインデックスを作成して、MongoDB が同じドキュメントを複数回追加しないようにします。 たとえば、多くのドキュメントが upsert: true で同じ更新を要求する場合、1つの update アクションだけが一意のインデックスを持つ新しいドキュメントを正常に挿入します。

構文:

db.Collection_name.update({Sele ction_ criteria}, {$set:{Update_data}}, {
upsert: <boo. lean >,
multi: <boo. lean>,
writeConcern: < document>,
collation: < document>,
arrayFilters: [ <filter document1>,  ],
hint:  <document|string>
})

upsert オプションの値を true に変更すると、新しいドキュメントが employee コレクションに挿入されます。

db.employee.update({name:"Priya"}, {$set: {department: "HR"}},{upsert:true})

upsert オプションの値が true に設定されているため、update() 関数は 2つのフィールド (name: "Priya"department: "HR") を持つ新しいドキュメントを挿入します。 Priya という名前に一致します。

更新方法

MongoDB の演算子式によるUpsert

指定されたコレクションのドキュメントがフィルターに一致しないとします。 その場合、update パラメータは update 演算子を含むドキュメントです。

upsert オプションの値は true です。 update 操作は、指定された query パラメータからの等価句に基づいて新しいドキュメントを作成し、update パラメータからの式を適用します。

別の言い方をすれば、upsert オプションが true で、指定されたフィルターに一致するドキュメントがない場合、update 操作は、query で指定されたフィールドを使用して、指定されたコレクションに新しいドキュメントを作成し、 更新 ドキュメント。

例:

upsert オプションの値を true に変更すると、新しいドキュメントが example コレクションに追加されます。

db.example.update({Name: "Rekha"},   // Query parameter
                  {$set: {Phone: '7842235468 '}, // Update document
                   $setOnInsert: {Gender: 'Female'}},
                  {upsert: true})

update() 関数は、クエリ条件のフィールド "Name: Rekha" を持つ新しいドキュメントを生成し、$set および $setOnInsert アクションを適用します。

演算子式

MongoDB で置換ドキュメントを使用した Upsert

提供されたコレクションのどのドキュメントもフィルタに適合せず、update パラメータに置換ドキュメントが含まれ、upsert ドキュメントの値が true に設定されているとします。 update アクションは、置換ドキュメントで指定されたフィールドを使用して、コレクションに新しいドキュメントを挿入します。

置換ドキュメントに _id フィールドが含まれている場合、MongoDB は新しいドキュメントに一意の _id フィールドを生成しません。 または、置換ドキュメントに _id フィールドがない場合、MongoDB は新しいドキュメント用に新しい _id フィールドを作成します。

クエリ パラメータと置換ドキュメントでは、個別の _id フィールド値は許可されないことに注意してください。 その場合、問題が発生します。

例:

upsert オプションの値を true に調整すると、新しいドキュメントが example コレクションに挿入されます。

db.example.update({Name:"Hema"}, // Query parameter
                  {Name:"Hema", Phone:8332564578}, // Replacement document
                  {upsert:true})

置換ドキュメント

MongoDB の集約パイプラインを使用したUpsert

集約パイプラインは、ドキュメントが入力として受け入れられ、結果としてドキュメントのコレクションとして生成されるマルチステージ パイプラインです。

生成されたドキュメントは入力として取得され、最後の段階まで次のステップ (利用可能な場合) で作成されます。 パイプラインのステージ数は、one から n の範囲です。

指定されたフィルターに適合するドキュメントがなく、update パラメーターに集計パイプラインが含まれ、upsert オプションの値が true に設定されているとします。 その場合、update 操作は新しいドキュメントをコレクションに挿入します。

この新しいドキュメントは、query パラメーターの等価句を使用して形成され、パイプラインがそれに適用されて、挿入するドキュメントが作成されます。

例:

upsert オプションの値を true に調整すると、新しいドキュメントが employee コレクションに挿入されます。

db.employee.update({name:"Ram"}, [{$set: {department: "HR", age:31}}],{upsert:true})

集約パイプライン

MongoDB のドット付き _id クエリによる Upsert

update() 関数がクエリに応じてコレクション内のデータを変更する方法と、一致するドキュメントが見つからない場合に upsert オプションが新しいフィールドを追加する方法を見てきました。

ただし、ドット付き _id クエリを使用した upsert は例外であり、この方法でドキュメントを挿入しようとすると、MongoDB からエラーが発生します。

図:

次の更新操作を見てください。 update 操作は upsert: true を指定し、クエリはドット表記を使用して _id フィールドに条件を提供するため、挿入するドキュメントの作成中に更新が失敗します。

db.employee.update({"_id.name":"Roma", "_id.uid":0},{age:21}, {upsert:true})

ドット クエリ

そのため、この記事では、MongoDB の空のフィールドにレコードを挿入する際の問題について説明しました。 Upsert は、さまざまなシナリオで簡単に説明されています。