尝试用猫鼬运行验证时遇到问题。
我需要在更新过程中验证值,以确保新值有效。就我而言,我有两个字段,一个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!`,
},
},
},
是period
或null
,如果我在undefined
上加上选项findOneAndUpdate
,则{ runValidators: true, context: 'query' }
是猫鼬对象,但是实际上,我实际上需要从要验证的文档中访问数据,以检查this
的原始值是否不高于start
的新值。
所以我想知道在验证期间如何获取当前文档?
如果由于某种原因这是不可能的,那么如何在更新期间进行验证?因为我需要在创建和更新时验证所有内容。
我考虑过一些“解决方法”,但是我敢肯定猫鼬有正确的方法来做。
答案 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”变成一个空对象。