【问题标题】:How to create a copy of a document before saving with Mongoose?如何在使用 Mongoose 保存之前创建文档副本?
【发布时间】:2019-10-20 06:06:04
【问题描述】:

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

这是我要使用的钩子:

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

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

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

    【讨论】:

    • 感谢您的建议,@virgiliogm!我已经考虑过将这个逻辑从钩子转移到我调用文档更新的控制器。我认为,最好和最清晰的方法是在那里执行此操作。
    猜你喜欢
    • 2011-07-18
    • 2018-04-27
    • 2017-03-13
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2014-04-07
    • 1970-01-01
    相关资源
    最近更新 更多