我有一个Schema,其中的balance字段声明如下所示
balance: {
type: Number,
min: 0,
default: 30
}
我将0设置为最小值,以便余额不是负值。但是当我通过更新查询减少余额值时,余额结果为负值。
我的更新查询:
User.update({
_id: mongoose.Types.ObjectId(id)
}, {
$inc: {
balance: -10
}
}, function(error, result) {
// code
});
我是否在代码中犯了错误?
答案 0 :(得分:5)
默认情况下,mongoose不会在更新调用上进行验证,但是有一个选项。查看mongoose文档:http://mongoosejs.com/docs/validation.html(更新验证器)
var opts = { runValidators: true };
Toy.update({}, { color: 'bacon' }, opts, function (err) {
assert.equal(err.errors.color.message,
'Invalid color');
});
答案 1 :(得分:2)
Mongoose验证是一个内部中间件,在更新时不会被调用;如果要在更新时强制执行验证,则应找到该文档,更新属性并保存。
例如:
User.findById(id, function(err, result) {
if (err) return handleError(err);
user.balance = -10;
user.save(function(err) {
if (err) return handleError(err);
...
});
});
答案 2 :(得分:0)
使用findByIdAndUpdate
启用更新验证(默认情况下禁用)将如下所示:
User.findByIdAndUpdate(id, {
$set: attributes,
}, {
new: true,
runValidators: true,
})
.then((user) => {
if (!user) {
// user not found
}
console.log(user);
})
.catch(e => console.log(e));
答案 3 :(得分:0)
这些答案中没有一个可以真正回答问题。
我遇到了这个问题,甚至使用了runValidators标志-猫鼬在某些操作上都无法验证。如下
https://mongoosejs.com/docs/validation.html#update-validators-only-run-for-some-operations
最后一个值得注意的细节:更新验证器仅在以下更新运算符上运行:
$ set
$ unset
$ push(> = 4.8.0)
$ addToSet(> = 4.8.0)
$ pull(> = 4.12.0)
$ pullAll(> = 4.12.0)
例如,无论number的值如何,以下更新将成功,因为更新验证程序将忽略$ inc。