Docs Menu
Docs Home
/
MongoDBマニュアル
/ / /

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()と組み合わせて使用する場合のさまざまな書込み操作の挿入動作を説明します。

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
}

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
}

更新メソッドは集計パイプラインを受け入れることができます。 たとえば、次の例では次のものが使用されています。

  • $replaceRoot ステージ、これは $setOnInsert 更新演算子式と似た動作を提供できます。

  • $set ステージは、$set 更新演算子式と同様に動作します。

  • 集計変数 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")
}

複数ドキュメント更新方法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"
}

更新メソッドは集計パイプラインを受け入れることができます。 たとえば、次の例では次のものが使用されています。

  • $replaceRoot ステージ、これは $setOnInsert 更新演算子式と似た動作を提供できます。

  • $set ステージは、$set 更新演算子式と同様に動作します。

  • 集計変数 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")
}

Tip

以下も参照してください。

戻る

Bulk.find.update

項目一覧