Docs 菜单
Docs 主页
/ / /
Node.js 驱动程序
/ / /

在单个操作中插入或更新

在此页面上

  • 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() 时将 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" },
...
]

后退

更新文档中的数组