我有一个用户通过 Web UI 更新的文档。我想创建文档的副本并将其保存到同一个集合中,然后再保存新的更改。
这是我尝试使用的钩子:
PrototypeSchema.pre('save', function(next) {
const protoCopy = new Prototype(proto.toObject())
protoCopy.save()
this.lastUpdateDate = new Date()
next()
})
这会导致执行无限预保存钩子。如何制作文档的副本并保存新版本(作为同一个文档)和以前的版本(作为新文档)?
根据pre-save 中间件文档,它不会在更新文档时运行,而是在插入时运行。为此,您应该使用预更新。但是,我很确定当中间件运行时,文档已经包含更改,因此保存该文档的副本将复制更新的文档,而不是保存原始文档的副本。我认为更简单的方法可能是将新文档(带有旧数据)保存在更新原始文档的同一位置(控制器或其他任何地方):
var originalId = "foo";
var changes = {foo: "bar"};
Prototype.findById(originalId, function(err, original){
if (err) return { err };
Prototype.insert(original, function(err){
if (err) return { err };
Prototype.findAndUpdate({_id: originalId}, changes, { new: true }, function(err, updated){
return { err, updated };
});
});
});
编辑:
关于我所说的(以及文档所说的)关于更新文档时未运行的预保存中间件,我只是想我不确定这是否取决于您使用的 Mongoose 版本。无论如何,我的代码适用于任何版本。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句