如果字段不在模式中,如何使猫鼬失败?

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 我自己没有尝试过。你有机会检查吗? 是的,我玩过它,发现它大部分都有效。我已在您的回答中添加了详细信息。

以上是关于如果字段不在模式中,如何使猫鼬失败?的主要内容,如果未能解决你的问题,请参考以下文章

模式实例化后如何使猫鼬模式属性唯一(已包含数据)

使用猫鼬添加不在模式中的字段

如何不在猫鼬中保存字段

查询集合而不在猫鼬中传递模式

在猫鼬中,如果我正在创建一个包含 4 个字段的模式。但我只保存两个字段的值。如何更新未给出的字段值?

构建猫鼬模式时如何引用不同集合中的特定字段?