如果字段不在模式中,如何使猫鼬失败?
Posted
技术标签:
【中文标题】如果字段不在模式中,如何使猫鼬失败?【英文标题】:How to make mongoose fail if field is not in schema? 【发布时间】:2019-05-23 22:52:15 【问题描述】:如果我尝试使用不在架构中的字段保存文档,我希望 mongoose 失败。
我知道strict
选项(https://mongoosejs.com/docs/guide.html#strict),但它不能满足我的需求。 strict: true
删除字段而不发出警告。并且strict: false
允许保存所有内容(从长远来看这不好)。
var thingSchema = new Schema(.., /* ?? */ )
var Thing = mongoose.model('Thing', thingSchema);
var thing = new Thing( iAmNotInTheSchema: true );
thing.save();
有没有办法提供一些选项让thing.save();
失败并出现错误?
我想为本地开发启用此选项。这样我就可以在不进行硬调试的情况下找到拼写错误和忘记的字段
更新答案:
以下情况适用于猫鼬v5.3.14
。他们可能会在未来的版本中对其进行更改。
请记住,"strict": "throw"
并不涵盖所有情况。大多数创建/更新操作都会抛出:
const model = new Model( name: 'Mario', iAmNotInTheSchema: true )
await Model.create( name: 'Mario', iAmNotInTheSchema: true )
await Model.updateOne(, iAmNotInTheSchema: true )
await Model.updateMany(, iAmNotInTheSchema: true )
await Model.findOneAndUpdate(, iAmNotInTheSchema: true )
await Model.findOneAndUpdate(, $set: iAmNotInTheSchema: true )
错误信息很好:
Field `iAmNotInTheSchema` is not in schema and strict mode is set to throw.
但是对于这种情况:
const model = await Model.findOne()
model.iAmNotInTheSchema = true
await model.save()
它不会抛出。代码运行没有任何错误,并且 iAmNotInTheSchema 将被忽略(如 strict: true
)。
【问题讨论】:
【参考方案1】:strict 选项也可以设置为“throw”,这将导致产生错误而不是丢弃坏数据。
有一个选项传递给架构构造函数以在这种情况下抛出错误。参考:https://mongoosejs.com/docs/guide.html#strict
new Schema(.., "strict": "throw");
【讨论】:
根据***.com/a/41419546/1142300 它不应该工作。不过先让我自己试试吧 @DenisZavershinskiy 我自己没有尝试过。你有机会检查吗? 是的,我玩过它,发现它大部分都有效。我已在您的回答中添加了详细信息。以上是关于如果字段不在模式中,如何使猫鼬失败?的主要内容,如果未能解决你的问题,请参考以下文章