Bulk.find.upsert()
Tip
MongoDB は、一括書込み操作を実行するための db.collection.bulkWrite()
メソッドも提供します。
説明
Bulk.find.upsert()
更新操作または置換操作の upsert オプションを true に設定します。構文は以下のようになります。
Bulk.find(<query>).upsert().update(<update>); Bulk.find(<query>).upsert().updateOne(<update>); Bulk.find(<query>).upsert().replaceOne(<replacement>); upsert
オプションがtrue
に設定されている場合、Bulk.find()
条件に一致するドキュメントが存在しない場合は、更新操作または置換操作によって挿入が実行されます。一致するドキュメントが存在する場合には、更新操作または置換操作は、指定された更新または置換を実行します。次の書き込み操作で
Bulk.find.upsert()
を使用します。
動作
以下では、 Bulk.find.upsert()
と組み合わせて使用する場合のさまざまな書込み操作の挿入動作を説明します。
Insert for Bulk.find.replaceOne()
Bulk.find.replaceOne()
メソッドは、フィールドと値のペアのみを含む置換ドキュメントをパラメータとして受け入れます。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { item: "abc123" } ).upsert().replaceOne( { item: "abc123", status: "P", points: 100, } ); bulk.execute();
Bulk.find.upsert()
オプションを使用した置換操作で挿入が実行される場合、挿入されるドキュメントは置換ドキュメントになります。 置換ドキュメントとクエリ ドキュメントのいずれも_id
フィールドを指定していない場合、MongoDB は_id
フィールドを追加します。
{ "_id" : ObjectId("52ded3b398ca567f5c97ac9e"), "item" : "abc123", "status" : "P", "points" : 100 }
Insert for Bulk.find.updateOne()
Bulk.find.updateOne()
メソッドは、次のいずれかをパラメータとして受け入れます。
フィールドと値のペアのみを含む置換ドキュメント(
Bulk.find.replaceOne()
と同じ)更新演算子式のみを含む更新ドキュメント
集計パイプライン。
フィールドと値のペア
パラメータがフィールドと値のペアのみを含む置換ドキュメントの場合、次のようになります。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { status: "P" } ).upsert().updateOne( { item: "TBD", points: 0, inStock: true, status: "I" } ); bulk.execute();
次に、 Bulk.find.upsert()
オプションを使用した更新操作で挿入が実行されると、挿入されたドキュメントは置換ドキュメントになります。 置換ドキュメントとクエリ ドキュメントのいずれも_id
フィールドを指定していない場合、MongoDB は_id
フィールドを追加します。
{ "_id" : ObjectId("52ded5a898ca567f5c97ac9f"), "item" : "TBD", "points" : 0, "inStock" : true, "status" : "I" }
更新演算子式
パラメータが更新演算子式のみを含む更新ドキュメントの場合、次のようになります。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { status: "P", item: null } ).upsert().updateOne( { $setOnInsert: { qty: 0, inStock: true }, $set: { points: 0 } } ); bulk.execute();
次に、 Bulk.find.upsert()
オプションを使用した更新操作で挿入が実行されると、更新操作はBulk.find()
メソッドのクエリ ドキュメントから フィールドと値を持つドキュメントを挿入し、更新ドキュメントから指定された更新を適用します。 アップデート ドキュメントでもクエリ ドキュメントでも_id
フィールドが指定されていない場合、MongoDB は_id
フィールドを追加します。
{ "_id" : ObjectId("5e28d1a1500153bc2872dadd"), "item" : null, "status" : "P", "inStock" : true, "points" : 0, "qty" : 0 }
Aggregation Pipeline
更新メソッドは集計パイプラインを受け入れることができます。 たとえば、次の例では次のものが使用されています。
$replaceRoot
ステージ、これは$setOnInsert
更新演算子式と似た動作を提供できます。集計変数
NOW
、これは現在の日時を解決し、$currentDate
更新演算子式と同様に動作します。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { item: "Not Found", status: "P" } ).upsert().updateOne( [ { $replaceRoot: { newRoot: { $mergeObjects: [ { qty: 0, inStock: true }, "$$ROOT" ] } } }, { $set: { points: 0, lastModified: "$$NOW" } } ] ); bulk.execute();
次に、 Bulk.find.upsert()
オプションを使用した更新操作によって挿入が実行されると、更新操作はBulk.find()
メソッドのクエリ ドキュメントから、 フィールドと値を持つドキュメントを挿入し、指定された集計パイプラインを適用します。 アップデート ドキュメントでもクエリ ドキュメントでも_id
フィールドが指定されていない場合、MongoDB は_id
フィールドを追加します。
{ "_id" : ObjectId("5e28cf1e500153bc2872d49f"), "qty" : 0, "inStock" : true, "item" : "Not Found", "status" : "P", "points" : 0, "lastModified" : ISODate("2020-01-22T22:39:26.789Z") }
Insert for Bulk.find.update()
複数ドキュメント更新方法upsert()
Bulk.find.update()
で を使用している場合、クエリ条件に一致するドキュメントがない場合は、更新操作によって 1 つの ドキュメントが挿入されます。
Bulk.find.update()
メソッドは、次のいずれかをパラメータとして受け入れます。
更新演算子式のみを含む更新ドキュメント
集計パイプライン。
更新演算子式
パラメータが更新演算子式のみを含む更新ドキュメントの場合、次のようになります。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { status: "P" } ).upsert().update( { $setOnInsert: { qty: 0, inStock: true }, $set: { status: "I", points: "0" } } ); bulk.execute();
次に、 Bulk.find.upsert()
オプションを使用した更新操作で挿入が実行されると、更新操作はBulk.find()
メソッドのクエリ ドキュメントのフィールドと値を含む単一のドキュメントを挿入し、更新ドキュメントから指定された更新を適用します。 アップデート ドキュメントでもクエリ ドキュメントでも_id
フィールドが指定されていない場合、MongoDB は_id
フィールドを追加します。
{ "_id": ObjectId("52ded81a98ca567f5c97aca1"), "status": "I", "qty": 0, "inStock": true, "points": "0" }
Aggregation Pipeline
更新メソッドは集計パイプラインを受け入れることができます。 たとえば、次の例では次のものが使用されています。
$replaceRoot
ステージ、これは$setOnInsert
更新演算子式と似た動作を提供できます。集計変数
NOW
、これは現在の日時に設定し、$currentDate
更新演算子式と同様の動作を提供できます。NOW
の値はパイプライン全体で同じです。集計変数にアクセスするには、変数の前に二重ドル記号$$
を付け、引用符で囲みます。
var bulk = db.items.initializeUnorderedBulkOp(); bulk.find( { item: "New Item", status: "P" } ).upsert().update( [ { $replaceRoot: { newRoot: { $mergeObjects: [ { qty: 0, inStock: true }, "$$ROOT" ] } } }, { $set: { points: 0, lastModified: "$$NOW" } } ] ); bulk.execute();
次に、 Bulk.find.upsert()
オプションを使用した更新操作で挿入が実行されると、更新操作はBulk.find()
メソッドのクエリ ドキュメントのフィールドと値を含む単一のドキュメントを挿入し、集計パイプラインを適用します。 アップデート ドキュメントでもクエリ ドキュメントでも_id
フィールドが指定されていない場合、MongoDB は_id
フィールドを追加します。
{ "_id" : ObjectId("5e2920a5b4c550aad59d18a1"), "qty" : 0, "inStock" : true, "item" : "New Item", "status" : "P", "points" : 0, "lastModified" : ISODate("2020-01-23T04:27:17.780Z") }