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

Posted

技术标签:

【中文标题】Mongoose .update() 不会触发验证检查【英文标题】:Mongoose .update() does not trigger validation checking 【发布时间】:2016-10-03 12:45:05 【问题描述】:

我可以设置超出枚举数组的值,但我不知道为什么 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);

    )

status 枚举应该只对以下三个有值:['created','shipped','confirmed']

但我可以:

【问题讨论】:

【参考方案1】:

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

但它支持实例方法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,当您在更新调用中包含 runValidators: true 选项时,它支持在 Schema.update 中验证 $set$unset 运算符的字段。

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

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

【讨论】:

以上是关于Mongoose .update() 不会触发验证检查的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬实例 .save() 不工作

猫鼬实例 .save() 不工作

更新架构声明后,Mongoose 不会更新新字段

更新架构声明后,Mongoose 不会更新新字段

使用标志 FLAG_UPDATE_CURRENT 时,小部件 onclick 挂起意图不会触发

如何在 Mongoose 中使用 Document#update?