我需要知道已修改的字段,或者是否在Mongoose架构中的前或发布 更新挂钩中修改了特定字段。 我尝试了以下内容,但仍无法弄明白:
schema.post('update', function (doc) {
//check modified fields or if the name field was modified and then update doc
});
我知道也许有一种方法 isModified ,如预 保存,但我不知道如何使用更新挂钩。 任何建议将不胜感激。
答案 0 :(得分:2)
如果您想知道要修改的字段,则需要通过调用save
发出更新命令:
Tank.findById(id, function (err, tank) {
if (err) return handleError(err);
tank.set({ size: 'large' });
tank.save(function (err, updatedTank) {
if (err) return handleError(err);
res.send(updatedTank);
});
});
这样就可以调用预保存挂钩,您将可以访问:
Document.prototype.modifiedPaths()
因为 pre-save 挂钩中的this
引用了该文档:
TankSchema.pre('save', function (next) {
// ...
this.modifiedPaths();
// ...
});
另一方面,通过调用update
发出 update 命令时,您将无法获得相同的结果:
Tank.update({ _id: id }, { $set: { size: 'large' }}, callback);
因为在调用update
时,文档挂钩(例如预存,保存后)未执行所有。相反,在这种情况下,正在执行查询挂钩(例如,更新前,更新后)。而查询挂钩的问题是它们内部的this
没有引用该文档,因此this.modifiedPaths === undefined
schema.post('update', function (doc) {
// `this` refers to model.Query
// `doc` refers to CommandResult
});
答案 1 :(得分:1)
试一试:
schema.post('update', function () {
const modifiedFields = this.getUpdate().$set;
// ...
});
答案 2 :(得分:0)
没有直接的方法可以做到。猫鼬正在跟踪一个名为isNew的变量,以检查是否创建了新文档。
有关文档#isNew的信息,请参见Document#isNew
但是,您可以创建自己的跟踪器来检入后期保存挂钩,以识别文档是否已更新。
schema.pre('save', function (doc) {
this.isDocUpdated = false;
if (this.isModified()) {
this.isDocUpdated = true;
}
});
schema.pre('save', function (doc) {
if (this.isDocUpdated) {
console.log('post save hook');
}
});
答案 3 :(得分:-1)
看看:
http://mongoosejs.com/docs/api.html#document_Document-modifiedPaths
返回修改后的路径数组。
schema.pre('save', function (next) {
//check modified fields or if the name field was modified and then update doc
var modified_paths = this.modifiedPaths();
next();
})