Mongoose 的 save() 函数简介

发布于 2022-07-14 13:15:47 字数 4560 浏览 231 评论 0

Mongoose save()函数 是将您对文档所做的更改保存到数据库的一种方法。 有几种方法可以 在 Mongoose 中更新文档 ,但是 save() 是功能最全的。 你应该使用 save() 除非您有充分的理由不更新文档。

save()

save() 上的一种方法 Mongoose 文档 。 这 save() 方法是异步的,所以它返回一个你可以 await 上。 创建 Mongoose 模型 使用 new,调用 save() 让 Mongoose 插入一个新文档。

const Person = mongoose.model('Person', Schema({
  name: String,
  rank: String
}));

const doc = new Person({
  name: 'Will Riker',
  rank: 'Commander'
});
// Inserts a new document with `name = 'Will Riker'` and
// `rank = 'Commander'`
await doc.save();

const person = await Person.findOne();
person.name; // 'Will Riker'

如果您从数据库加载现有文档并对其进行修改, save() 而是更新现有文档。

const person = await Person.findOne();
person.name; // 'Will Riker'

// Mongoose _tracks changes_ on documents. Mongoose
// tracks that you set the `rank` property, and persists
// that change to the database.
person.rank = 'Captain';
await person.save();

// Load the document from the database and see the changes
const docs = await Person.find();

docs.length; // 1
docs[0].rank; // 'Captain'

Mongoose 的更改跟踪会根据您对文档所做的更改向 MongoDB 发送最小更新。 您可以设置 Mongoose 的调试模式 以查看 Mongoose 发送到 MongoDB 的操作。

mongoose.set('debug', true);

person.rank = 'Captain';
// Prints:
// Mongoose: people.updateOne({ _id: ObjectId("...") }, { '$set': { rank: 'Captain' } })
await person.save();

验证

Mongoose 验证 修改的路径。 如果您将某个字段设置为无效值,Mongoose 将在您尝试 save() 那个文件。

const Person = mongoose.model('Person', Schema({
  name: String,
  age: Number
}));

const doc = await Person.create({ name: 'Will Riker', age: 29 });

// Setting `age` to an invalid value is ok...
doc.age = 'Lollipop';

// But trying to `save()` the document errors out
const err = await doc.save().catch(err => err);
err; // Cast to Number failed for value "Lollipop" at path "age"

// But then `save()` succeeds if you set `age` to a valid value.
doc.age = 30;
await doc.save();

中间件

Mongoose 中间件 让你告诉 Mongoose 每次都执行一个函数 save() 叫做。 例如,调用 pre('save') 告诉 Mongoose 在执行 之前 执行 save()

const schema = Schema({ name: String, age: Number });
schema.pre('save', function() {
  // In 'save' middleware, `this` is the document being saved.
  console.log('Save', this.name);
});
const Person = mongoose.model('Person', schema);

const doc = new Person({ name: 'Will Riker', age: 29 });

// Prints "Save Will Riker"
await doc.save();

相似地, post('save') 执行一个函数 调用 save()。例如,您可以结合 pre('save')post('save') 打印多长时间 save()

const schema = Schema({ name: String, age: Number });
schema.pre('save', function() {
  this.$locals.start = Date.now();
});
schema.post('save', function() {
  console.log('Saved in', Date.now() - this.$locals.start, 'ms');
});
const Person = mongoose.model('Person', schema);

const doc = new Person({ name: 'Will Riker', age: 29 });

// Prints something like "Saved in 12 ms"
await doc.save();

save() 中间件是递归的,所以调用 save() 在父文档上也会触发 save() 子文档的中间件。

const shipSchema = Schema({ name: String, registry: String });
shipSchema.pre('save', function() {
  console.log('Save', this.registry);
});
const schema = Schema({
  name: String,
  rank: String,
  ship: shipSchema
});
const Person = mongoose.model('Person', schema);

const doc = new Person({
  name: 'Will Riker',
  age: 29,
  ship: {
    name: 'Enterprise',
    registry: 'NCC-1701-D'
  }
});

// Prints "Save NCC-1701-D"
await doc.save();

doc.ship.registry = 'NCC-1701-E';
// Prints "Save NCC-1701-E"
await doc.save();

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

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

发布评论

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

关于作者

寂寞花火°

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

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