Mongoose .update()不会触发验证检查

时间:2016-06-03 12:35:44

标签: mongoose

我可以设置超出枚举数组的值,我不知道为什么mongoose没有验证值,我是否以错误的方式更新枚举?

我的代码:

var OrderSchema = new mongoose.Schema({
status:{type:String,enum:['created','shipped','confirmed']},
)};

var changeOrderStatus = function(shopId,orderId,status,callback){

    Order.update({_id:orderId,shop:shopId},{$set:{status:status}},{upsert:false},
        function(err){

            console.log(err);
            callback(err);

    })
}

状态枚举应该只有三个值:[&#39;已创建&#39;,&#39;已发货&#39;已确认&#39;] < / p>

但我能做到:

enter image description here

1 个答案:

答案 0 :(得分:6)

版本4.0之前的Mongoose不支持对.update.findByIdAndUpdate.findOneAndUpdate等架构静态方法进行验证。

但它支持实例方法document.save()

首先,您需要查找订单,然后更改所需的属性并致电.save()。像这样:

Order.findOne({ _id: orderId, shop: shopId }, function(err, order) {
  order.status = 'foo';
  order.save(function(err, savedOrder) {
    // ERROR HERE
  })
})

如果您使用Mongoose 4.0,则在更新调用中包含Schema.update选项时,它支持$set$unset运算符字段的runValidators: true中的验证。< / p>

所以你的更新将如下所示:

Order.update(
  { _id: orderId, shop: shopId },
  { $set: { status: status }},
  { upsert: true, runValidators: true }, function(err) {
    console.log(err);
    callback(err);
}