最小验证不适用于Mongoose

时间:2016-09-23 10:19:41

标签: node.js mongodb mongoose

我有一个Schema,其中的balance字段声明如下所示

balance: {
    type: Number,
    min: 0,
    default: 30
}

我将0设置为最小值,以便余额不是负值。但是当我通过更新查询减少余额值时,余额结果为负值。

我的更新查询:

User.update({
    _id: mongoose.Types.ObjectId(id)
}, {
    $inc: {
        balance: -10
    }
}, function(error, result) {
    // code
});

我是否在代码中犯了错误?

4 个答案:

答案 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。