【问题标题】:Modifying mongoose document on pre hook of findOneAndUpdate()在 findOneAndUpdate() 的 pre hook 上修改 mongoose 文档
【发布时间】:2017-06-18 12:00:15
【问题描述】:

我有一个这样的猫鼬模式

var schema = new Schema({
    id:Number
    updated_at:Date
});

我正在使用findOneAndUpdate() 来更新这个模型

model.findOneAndUpdate(
    { id: json.id },
    json,
    {
        upsert: true,
        runValidators: true
    })
    .then(() => {
        recordsUpdated++;
    })
    .catch((err) => {
        this.emit('error', err);
    });

json 中传递的值不正确,我需要对其进行一些修改。我正在寻找一个预挂钩来进行修改。我试过了

faction.pre('findOneAndUpdate', function (next) {
   this.update({ $set: { updated_at: this.getUpdate().updated_at * 1000 } });
   next();
});

简而言之,我想在更新数据库之前将以秒为单位的时间戳转换为毫秒,但这不起作用。

【问题讨论】:

  • 在中间件中执行此操作而不是在调用findOneAndUpdate 之前修复json 似乎是错误的:json.updated_at *= 1000;
  • 可能是。这个特定的用例可以在没有中间件的情况下完成。不过,如果知道如何实现这个过程,那就太好了。

标签: node.js mongoose


【解决方案1】:

在四处乱扔石头之后,对我有用的是

schema.pre('findOneAndUpdate', function (next) {
    this._update.updated_at *= 1000;
    next();
});

简而言之,需要修改_update 属性中存在的文档。

【讨论】:

  • 我会等待其他可能比我更好的答案
  • 这在 2019 年仍然有效吗? @Sayak
  • @SumeetKumar 取决于我猜的 MongoDB 和 mongoose 版本。我不知道,因为我不再在任何地方使用它了。
  • 我浏览了文档寻找有用的东西,但没有成功也找不到任何说this._update属性包含文档的东西
  • @SumeetKumar 我记得在文档中没有找到这个。我不得不手动检查对象的内容并找出东西。新版本可能会发生变化。我建议尝试这样做,如果不成功,请尝试查看 this 对象在挂钩中包含的内容,然后从那里继续。
【解决方案2】:

更好的解决方案是这样的:

schema.pre('findOneAndUpdate', function (this, next) {
    this.update().updated_at *= 1000;
    next();
});

【讨论】:

    猜你喜欢
    • 2013-08-15
    • 2018-12-28
    • 2019-07-01
    • 2015-10-27
    • 2016-04-25
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多