在单个操作中插入或更新
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" }, ... ]