我想在预保存 Hook 之前获取对象的值并将其与新值进行比较。正如 mongoose get db value in pre-save hook 中所建议的和 https://github.com/Automattic/mongoose/issues/2952 ,我做了一个 post-init Hook ,将其复制到 doc._original。问题是我不确定如何在不同的钩子(Hook)中访问这个 ._original。
FieldSchema
.post('save', function (doc) {
console.log(doc._original);
});
FieldSchema
.post('init', function (doc) {
doc._original = doc.toObject();
});
我知道 post save Hook 中的文档与 post init Hook 中的文档不同,但我如何访问原始文档?
最佳答案
您只能访问已在其架构中定义的数据库属性。因此,由于您可能尚未将 _original
定义为架构中的属性,因此您无法访问,甚至无法设置它。
一种方法是在您的架构中明确定义_original
。
但要获取和设置架构中未定义的属性:请使用 .get
和 .set
以及 {strict:假}
FieldSchema
.post('save', function (doc) {
console.log(doc.get('_original'));
});
FieldSchema
.post('init', function (doc) {
doc.set('_original', doc.toObject(), {strict: false});
});
请注意传递给 .set
的选项 {strict: false}
,这是必需的,因为您要设置架构中未定义的属性。
更新:
我之前没有注意到的第一件事是,在你的问题标题中你想要 pre-save Hook ,但在你的代码中你实际上有一个 post-save Hook (这就是我的答案的基础)在)。我希望您知道自己在做什么,在保存文档后会调用后保存 Hook 。
但在我看来,从我可以理解的问题的初衷来看,我认为您实际上应该使用预保存 Hook 及其异步版本(通过传递 next
回调),以便您可以.find
(检索)数据库中的文档,这将是原始版本,因为新版本尚未保存(预保存),从而使您能够在不实际保存任何新字段的情况下进行比较,这似乎是一种反模式。
所以类似:
FieldSchema
.pre('save', function (next) {
var new_doc = this;
this.constructor // ≈ mongoose.model('…', FieldSchema).findById
.findById(this.id, function(err, original){
console.log(original);
console.log(new_doc);
next();
});
});
关于node.js - 如何在 Mongoose 中使用预保存 Hook 数据库值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30827065/