Docs Menu
Docs Home
/ / /
Node.js ドライバー
/ / /

1 回の操作で挿入またはアップデート

項目一覧

  • Overview
  • アップデートの実行
  • アップサートの実行

アプリケーションで MongoDB にデータをストアしたり変更したりする場合、おそらく挿入操作とアップデート操作を使うでしょう。特定のワークフローでは、挿入操作とアップデート操作のどちらを実行するかは、ドキュメントが存在するかどうかによって異なります。このような場合、次のメソッドで使用可能な upsert オプションを使用して、アプリケーション論理を合理化できます。

  • updateOne()

  • replaceOne()

  • updateMany()

これらのメソッドに渡されたクエリフィルターで一致するものが見つからず、upsert オプションを true に設定すると、MongoDB はアップデートドキュメントを挿入します。例を見てみましょう。

アプリケーションがフードトラックの現在位置を追跡し、次のような myDB.foodTrucks コレクションに最も近い住所データをストアしているとします。

[
{ name: "Haute Skillet", address: "42 Avenue B" },
{ name: "Lady of the Latke", address: "35 Fulton Rd" },
...
]

アプリケーションユーザーとして、フードトラックが通常の場所を変更しているという記事を読み、そのアップデートを適用したいとします。このアップデートは、次のようになります。

const myDB = client.db("myDB");
const myColl = myDB.collection("foodTrucks");
const query = { name: "Deli Llama" };
const update = { $set: { name: "Deli Llama", address: "3 Nassau St" }};
const options = {};
myColl.updateOne(query, update, options);

「Deli Llama」という名前のフードトラックが存在する場合、上記のメソッド呼び出しによってコレクション内のドキュメントがアップデートされます。ただし、コレクションに「Deli Llama」という名前のフードトラックがない場合は、変更は行われません。

コレクションにまだ存在しない場合でも、フードトラックに関する情報を追加したい場合を考えてみましょう。 最初にドキュメントが存在するかどうかをクエリしてドキュメントを挿入するか更新するかを判断するのではなく、次のようにupdateOne()の呼び出しでupserttrueに設定できます。

const query = { name: "Deli Llama" };
const update = { $set: { name: "Deli Llama", address: "3 Nassau St" }};
const options = { upsert: true };
myColl.updateOne(query, update, options);

上記の操作を実行すると、操作前に "Deli Llama" ドキュメントがコレクションに存在していなくても、コレクションは次のようになります。

[
{ name: "Haute Skillet", address: "42 Avenue B" },
{ name: "Lady of the Latke", address: "35 Fulton Rd" },
{ name: "Deli Llama", address: "3 Nassau St" },
...
]

戻る

ドキュメント内の配列の更新