【问题标题】:How to get document values while validating during a mongoose document update?如何在猫鼬文档更新期间验证时获取文档值?
【发布时间】:2020-09-14 22:26:52
【问题描述】:

我在尝试使用 mongoose 运行验证时遇到问题。 我需要在更新期间验证一个值,以确保新值有效。就我而言,我有两个字段,一个start 和一个end 字段,这意味着在更新时我需要检查新的end 值是否低于当前的start 值。

我的验证是

  period: {
    start: { type: Date, required: true, default: new Date() },
    end: {
      type: Date,
      required: true,
      validate: {
        validator: function (v) {
          return this.period.start < v;
        },
        message: props =>
          `finish date ${props.value} is previous than start date!`,
      },
    },
  },

这在创建期间可以正常工作,但是当您尝试更新时它根本不起作用。它说periodnullundefined,如果我添加findOneAndUpdate 选项{ runValidators: true, context: 'query' },那么this 是一个猫鼬对象,但我实际上需要访问我的文档中的数据m 尝试验证以检查 start 的原始值是否不高于 end 的新值。

所以我想知道如何在验证期间获取当前文档?

如果由于某种原因这是不可能的,我如何在更新期间进行验证?因为我需要在创建和更新时验证所有内容。

我想过一些“解决方法”,但我确信 mongoose 有正确的方法。

【问题讨论】:

    标签: javascript mongoose


    【解决方案1】:

    你做不到

    在遇到同样的问题后——mongodb 不支持在更新期间访问更新的文档。这意味着:如果您想在更新期间使用文档验证方法,则可以在没有其他字段的情况下进行。 这意味着,您可以在没有“this”关键字的情况下独立验证, 或在更新功能中验证,或使用我发现的这个解决方法:

    发送您需要在查询中验证的字段/变量(假设在选项对象中),如下所示:{ runValidators: true, context: 'query', start: whatYouNeed }。请参阅docs 以供参考。 把它们加起来: 验证器函数,在您的模型定义中:

    validator:function(value){
    if(value<this.options.period.start)do something
    }
    

    和更新调用:

    findByIdAndUpdate(id,updateObject,{{ runValidators: true, context: 'query', start: 
    whatYouNeed }})
    

    编辑:注意不要在验证器中使用箭头函数,因为它会将“this”变成一个空对象。

    【讨论】:

      猜你喜欢
      • 2018-09-08
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多