在猫鼬文档更新期间如何在验证时获取文档值?

时间:2020-05-27 18:43:58

标签: javascript mongoose

尝试用猫鼬运行验证时遇到问题。 我需要在更新过程中验证值,以确保新值有效。就我而言,我有两个字段,一个start和一个end字段,这意味着在更新时,我需要检查新的end值是否小于当前的{{1 }}值。

我的验证是

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!`, }, }, }, periodnull,如果我在undefined上加上选项findOneAndUpdate,则{ runValidators: true, context: 'query' }是猫鼬对象,但是实际上,我实际上需要从要验证的文档中访问数据,以检查this的原始值是否不高于start的新值。

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

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

我考虑过一些“解决方法”,但是我敢肯定猫鼬有正确的方法来做。

1 个答案:

答案 0 :(得分:0)

你就是不能

遇到同样的问题后-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”变成一个空对象。