MongoDB に存在しない場合はレコードを挿入する
-
MongoDB の
Upsert
-
MongoDB の
findAndModify()
メソッドによるUpsert
- MongoDB の update() メソッドによる Upsert
-
MongoDB の演算子式による
Upsert
-
MongoDB で置換ドキュメントを使用した
Upsert
-
MongoDB の集約パイプラインを使用した
Upsert
-
MongoDB のドット付き
_id
クエリによるUpsert
この記事では、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
に設定すると、プロシージャは次の操作のいずれかを実行します。
- 特定のクエリ条件に一致するドキュメントが見つかった場合、
findAndModify()
メソッドはドキュメントを更新します。 - 指定されたクエリ条件に一致するドキュメントがない場合、
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"
) を持つ新しいドキュメントを挿入します。
MongoDB の update() メソッドによる Upsert
update()
関数では、upsert
オプションを利用できます。 この関数のこのパラメーターのデフォルト値は false
です。
このオプションの値を true
に設定すると、プロシージャは次のいずれかを実行します。
- 指定されたクエリ条件に一致するドキュメントが見つかった場合、
update()
メソッドがドキュメントを更新します。 - 指定されたクエリ基準を満たすドキュメントがない場合、
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
は、さまざまなシナリオで簡単に説明されています。