我有一个文档,用户可以通过Web UI进行更新。我想创建文档的副本并将其保存到相同的集合中,然后再保存新的更改。
这是我要消耗的钩子:
PrototypeSchema.pre('save', function(next) {
const protoCopy = new Prototype(proto.toObject())
protoCopy.save()
this.lastUpdateDate = new Date()
next()
})
这将导致执行无限次的预保存钩子。如何制作文档的副本,并同时保存新版本(作为同一文档)和先前版本(作为新文档)?
答案 0 :(得分:0)
根据pre-save middleware documentation,它在更新文档时不会运行,而是在插入时运行。为此,您应该使用预更新。但是,我很确定中间件运行时文档已经包含更改,因此保存该文档的副本将复制更新的文档,而不是保存原始文档的副本。我认为更简单的方法可能是将新文档(包含旧数据)保存在更新原始文档的同一位置(控制器或其他地方):
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的版本。无论如何,我的代码都可以在任何版本上使用。