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

谢尔盖·巴沙罗夫

我有一个用户通过 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何从JSON创建Mongoose模式

如何在Mongoose中将_id设置为db文档?

如何在Mongoose中更新/上传文档?

如何使用Mongoose获取文档数量?

MongoDB使用Mongoose保存问题

如何在Mongoose中增加子文档的属性?

在findOneAndUpdate()之前使用Mongoose的pre钩子获取文档

如何在Node Mongo DB mongoose Express App中同时创建文档和子文档

如何在node.js上使用mongoose从mongodb基础检索文档?

如何在排序之前保存数组的副本?

Mongoose,MongoDB:如何在push()之后保存()文档?

如何在MongoDB中使用数组获取嵌入式文档(使用Mongoose)

在保存到Mongoose(ExpressJS)中之前如何在Model中格式化数据

如何在Mongoose中使用预保存钩子数据库值?

如何在Express POST路由中使用Mongoose保存方法

如何在MongoDB中创建文档?

如何在构建包时使用 devtools 创建文档?

如何插入多个文档并使用 mongoose 更新它们的副本?

如何在 mongoose/mongodb 中对子文档数组进行排序?

如何在 Mongoose 中使用地理空间查询检索文档

如何使用 mongoose 和 node js 创建文档而不在 mongodb 中插入不需要的字段数据?

使用 Mongoose 模式保存一系列子文档

如何创建一个新的 Mongoose 文档,然后在保存之前更新

如何在某个日期使用 Mongoose 自动删除 MongoDB 中的文档

在MongoDB中创建文档时如何使用Mongoose指定_id字段?

如何使用 mongoose 查询 mongo 文档?

使用 mongoose 查找多个文档

使用 Mongoose 创建包含子文档的文档

如何使用 Mongoose 更新 MongoDB 中的文档