在 Mongoose 中更新文档
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论