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

时间:2019-06-04 17:08:20

标签: javascript node.js mongodb mongoose

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

这是我要消耗的钩子:

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

  this.lastUpdateDate = new Date()
  next()
})

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

1 个答案:

答案 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的版本。无论如何,我的代码都可以在任何版本上使用。