如何允许猫鼬模式中的枚举字段为空?

Posted

技术标签:

【中文标题】如何允许猫鼬模式中的枚举字段为空?【英文标题】:how to allow nullable for an enum field in mongoose schema? 【发布时间】:2020-12-20 10:51:48 【问题描述】:

我正在尝试使用 mongoose 在 MongoDB 中创建一个新对象。

这是我的猫鼬模式:

const UsersSchema = new Schema<BaseUser>(
    
        email: 
            type: Schema.Types.String,
            index: true,
            required: true,
            unique: true,
        ,
        someKey: 
            type: Schema.Types.String,
            default: null,
            required: false,
            enum: Object.values(SomeEnumObj),
        
    ,
    
        timestamps: true,
    
);

enum SomeEnumObj = 
 TEST = "TEST",

当我尝试使用以下方式创建新用户时:

model.create(
 email: 'some@email.com',
).exec()

以下错误抛出:

users validation failed: someKey: `null` is not a valid enum value for path `someKey`., 

我可以通过设置来解决这个问题:

enum: [...Object.values(SomeEnumObj), null]

但我想知道是否有更好或更正确的方法来执行此操作,因为我的解决方案感觉有点笨拙,我希望如果我将默认设置为 null,验证器将允许它为 null。

【问题讨论】:

您不能将 null 作为值包含在 SomeEnumObj 中吗? --> SomeEnumObj = TEST: "TEST", _null: null mmmm 我已经考虑过了。但我也将枚举用作验证器,因此在编辑用户时,不允许 someKey 为空...我刚刚意识到这是一个非常糟糕的做法,所以我只是将空添加到枚举/禁止值可以为空... 【参考方案1】:

基于this issue 我也没有找到任何合适的解决方案,因为这也是我的问题。我相信没有必要添加 null 作为 默认值 (default: null) 来解决问题。

只需将其添加到您的架构中:

Object.values(SomeEnumObj).concat([null])

您的架构:

...

someKey: 
  type: Schema.Types.String,
  enum: Object.values(SomeEnumObj).concat([null]),


...

【讨论】:

nullable:true 对我不起作用,我必须添加.concat([null]), nullable: true 没用

以上是关于如何允许猫鼬模式中的枚举字段为空?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

猫鼬中的唯一如果不是空检查

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

如何让猫鼬列出集合中的所有文档?判断集合是不是为空?

猫鼬模式中的嵌套对象