在单个操作中插入或更新
概述
如果你的应用程序在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"的食物车,则不会进行任何更改。
执行Upsert
考虑以下情况:您想在食物卡车尚未存在于您的集合中时添加有关该食物卡车的信息。而不是首先查询该食物卡车是否存在以确定是插入还是更新文档,我们可以在调用 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" }, ... ]