如何在使用 Mongoose 保存之前创建文档的副本



我有一个用户通过Web UI更新的文档。我想创建文档的副本并将其保存到同一集合中,然后再保存新的更改。

这是我尝试使用的钩子:

PrototypeSchema.pre('save', function(next) {
  const protoCopy = new Prototype(proto.toObject())
  protoCopy.save()
  this.lastUpdateDate = new Date()
  next()
})

这会导致执行无限的预保存钩子。如何制作文档的副本并保存新版本(作为同一文档(和以前的版本(作为新文档(?

根据预保存的中间件文档,它不会在更新文档时运行,而是在插入时运行。为此,您应该使用预更新。但是,我很确定当中间件运行时,文档已经包含更改,因此保存该文档的副本将复制更新的文档,而不是保存原始文档的副本。我认为更简单的方法可能是将新文档(与旧数据一起(保存在更新原始文档的同一位置(控制器或其他位置(:

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 版本。无论如何,我的代码适用于任何版本。

最新更新