node.js - 如何在 Mongoose 中使用预保存 Hook 数据库值?

标签 node.js mongodb mongoose

我想在预保存 Hook 之前获取对象的值并将其与新值进行比较。正如 mongoose get db value in pre-save hook 中所建议的和 https://github.com/Automattic/mongoose/issues/2952 ,我做了一个 post-init Hook ,将其复制到 doc._original。问题是我不确定如何在不同的钩子(Hook)中访问这个 ._original。

FieldSchema
  .post('save', function (doc) {
    console.log(doc._original);
  });

FieldSchema
  .post('init', function (doc) {
    doc._original = doc.toObject();
  });

我知道 post save Hook 中的文档与 post init Hook 中的文档不同,但我如何访问原始文档?

最佳答案

您只能访问已在其架构中定义的数据库属性。因此,由于您可能尚未将 _original 定义为架构中的属性,因此您无法访问,甚至无法设置它。

一种方法是在您的架构中明确定义_original

但要获取和设置架构中未定义的属性:请使用 .get.set 以及 {strict:假}

FieldSchema
  .post('save', function (doc) {
    console.log(doc.get('_original'));
  });

FieldSchema
  .post('init', function (doc) {
    doc.set('_original', doc.toObject(), {strict: false});
  });

请注意传递给 .set 的选项 {strict: false},这是必需的,因为您要设置架构中未定义的属性。

<小时/>

更新:

我之前没有注意到的第一件事是,在你的问题标题中你想要 pre-save Hook ,但在你的代码中你实际上有一个 post-save Hook (这就是我的答案的基础)在)。我希望您知道自己在做什么,在保存文档后会调用后保存 Hook 。

但在我看来,从我可以理解的问题的初衷来看,我认为您实际上应该使用预保存 Hook 及其异步版本(通过传递 next 回调),以便您可以.find(检索)数据库中的文档,这将是原始版本,因为新版本尚未保存(预保存),从而使您能够在不实际保存任何新字段的情况下进行比较,这似乎是一种反模式。

所以类似:

FieldSchema
  .pre('save', function (next) {
    var new_doc = this;
    this.constructor   // ≈ mongoose.model('…', FieldSchema).findById
      .findById(this.id, function(err, original){
        console.log(original);
        console.log(new_doc);
        next();
      });
  });

http://mongoosejs.com/docs/middleware.html

关于node.js - 如何在 Mongoose 中使用预保存 Hook 数据库值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30827065/

相关文章:

javascript - 如何使用 nodejs 发送 udp 包?

javascript - 尝试清除消息时出现 DiscordAPIError 无效的表单正文

javascript - firebase实时数据库是mongoDb吗?

node.js - NodeJS Express 依赖注入(inject)和数据库连接

javascript - Mongoose 不发送更新结果

javascript - 为什么浏览器在使用 createReadStream() Node.js 时一直加载

javascript - 将pdf表单字段传递给node.js/electronic app

java - 使用 Java 从 mongoDB 检索文档数组

javascript - Mongoose - 使用 require 引用另一个模型

javascript - Mongoose 批量更新操作