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