我使用Mongoose使用以下选项对更新运行验证:
{
runValidators: true,
context: 'query',
new: true
}
这很好并且可以按预期进行验证,直到我的findOneAndUpdate查询包含$ and运算符为止。
以下代码按预期进行更新-在更新的字段上运行验证并且不返回错误
Model.findOneAndUpdate({_id: '5c7551650bdecf4388ac984e', name: 'A Name'}, {name: 'A New Name'})
以下代码返回这些错误:
ValidationError:_id:错误,预期_id
是唯一的。
ValidationError:_id:错误,预期name
是唯一的。
这些错误是由名为mongoose-unique-validator
的插件创建的,该插件可验证唯一性。
Model.findOneAndUpdate({$and: [{_id: '5c7551650bdecf4388ac984e'}, {name: 'A Name'}]}, {name: 'A New Name'})
我需要$and
的原因是因为我还将CASL用于访问控制,这就是它创建我想用于安全性的记录级访问查询的方式。
当我第一次设置更新验证逻辑时,即当我学会将context: 'query'
添加到我的选项中时,我就经历了这种类型的验证错误,但是现在我很茫然。
难道我不能在查询中使用$and
吗?为什么会这样?