1 回の操作で挿入またはアップデート
Overview
アプリケーションで MongoDB にデータをストアしたり変更したりする場合、おそらく挿入操作とアップデート操作を使うでしょう。特定のワークフローでは、挿入操作とアップデート操作のどちらを実行するかは、ドキュメントが存在するかどうかによって異なります。このような場合、次のメソッドで使用可能な upsert
オプションを使用して、アプリケーション論理を合理化できます。
これらのメソッドに渡されたクエリフィルターで一致するものが見つからず、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()
の呼び出しでupsert
をtrue
に設定できます。
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" }, ... ]