在 Mongoose 中更新文档

发布于 2022-07-28 00:01:20 字数 4629 浏览 217 评论 0

Mongoose 有 4 种不同的方式来更新文档。 这是一个列表:

这4种方式有什么区别? 让我们来看看每个函数的作用。

使用 save()

下面是一个使用示例 save() 更新 Jon Snow 的标题。

const schema = new mongoose.Schema({ name: String, title: String });
const CharacterModel = mongoose.model('Character', schema);

const doc = await CharacterModel.create({
  name: 'Jon Snow',
  title: `Lord Commander of the Night's Watch`
});

// Update the document by setting a property and calling `save()`
doc.title = 'King in the North';
await doc.save();

这个简单的例子有几个细微差别。 第一的, save() 是文档上的方法,这意味着您必须有一个要保存的文档。 你需要要么 create()或使用 find() 获取文件。

其次,Mongoose 文档具有更改跟踪功能。 在引擎盖下,当你调用 doc.save(),Mongoose 知道你设置 title 并改变你的 save() 呼入 updateOne({ $set: { title } })。尝试在 调试模式下运行 Mongoose 以查看 Mongoose 执行的查询。

使用 Model.updateOne()Model.updateMany()

使用 Model.updateOne()Model.updateMany(),您可以在不先从数据库加载文档的情况下更新文档。 在下面的示例中,文档与 name = 'Jon Snow' 不在 Node.js 进程的内存中时 updateOne() 叫做。

// Update the document using `updateOne()`
await CharacterModel.updateOne({ name: 'Jon Snow' }, {
  title: 'King in the North'
});

// Load the document to see the updated value
const doc = await CharacterModel.findOne();
doc.title; // "King in the North"

updateMany() 很相似。 这两个函数的区别在于 updateOne() 更新 一个 文档,而 updateMany() 将更新与过滤器匹配的每个文档。

你应该使用 save()而不是 updateOne()updateMany() 在可能的情况。 然而, Model.updateOne()Model.updateMany() 有几个优点:

  • updateOne()原子 。 如果您使用 find(),它可能会在你之前改变 save() 它。
  • updateOne() 不需要您将文档加载到内存中,如果您的文档很大,这可能会给您带来更好的性能。

使用 Document#updateOne()

Document#updateOne() 函数是语法糖 Model.updateOne()。如果您已经在内存中拥有该文档, doc.updateOne() 结构 Model.updateOne() 打电话给你。

// Load the document
const doc = await CharacterModel.findOne({ name: 'Jon Snow' });

// Update the document using `Document#updateOne()`
// Equivalent to `CharacterModel.updateOne({ _id: doc._id }, update)`
const update = { title: 'King in the North' };
await doc.updateOne(update);

const updatedDoc = await CharacterModel.findOne({ name: 'Jon Snow' });
updatedDoc.title; // "King in the North"

一般来说, Document#updateOne() 很少有用。 你最好使用 save() 并使用 Model.updateOne() 对于以下情况 save() 不够灵活。

使用 Model.findOneAndUpdate()

Model.findOneAndUpdate()功能 或其变体 Model.findByIdAndUpdate() 行为类似于 updateOne():他们自动更新与第一个参数匹配的第一个文档 filter。不像 updateOne(),它会返回更新的文档。

const doc = await CharacterModel.findOneAndUpdate(
  { name: 'Jon Snow' },
  { title: 'King in the North' },
  // If `new` isn't true, `findOneAndUpdate()` will return the
  // document as it was _before_ it was updated.
  { new: true }
);

doc.title; // "King in the North"

概括

一般来说,你应该使用 save() 在 Mongoose 中更新文档,除非您需要原子更新。 以下是更新文档的所有 4 种方法的主要功能的摘要:

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

耳根太软

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文