如果字段设置为 null,则恢复为 mongoose 中的默认值

Posted

技术标签:

【中文标题】如果字段设置为 null,则恢复为 mongoose 中的默认值【英文标题】:Revert to default value in mongoose if field is set to null 【发布时间】:2016-11-10 09:42:16 【问题描述】:

我正在使用带有 nodeJS 的猫鼬。考虑以下架构:

var PersonSchema = new mongoose.Schema(
    "name": type: String, default: "Human",
    "age": type: Number, defualt:20
);
mongoose.model('Person', PersonSchema);

var order = new Order(
    name:null
);

这将创建一个名称设置为 null 的新个人文档。


    name:null,
    age: 20

无论如何要检查正在创建/更新的属性是否为空,如果为空,请将其设置回默认值。以下声明

var order = new Order();
order.name = null;
order.save(cb);

应该创建一个名称设置为默认值的新个人文档。


    name:"Human",
    age: 20

如何使用 NodeJs 和 mongoose 实现这一点。

【问题讨论】:

【参考方案1】:

有几种方法可以解决这个问题:

PRE-SAVE/PRE-VALIDATE 挂钩

Mongoose Middleware hooks

中间件(也称为 pre 和 post 钩子)是在异步函数执行期间传递控制权的函数。

PersonSchema.pre('save', function(next) 
    if (this.name === null) 
        this.name = 'Human';
    

    next();
);

枚举

Mongoose Validation 和 Mongoose Enums

字符串有枚举、匹配、最大长度和最小长度验证器。

var PersonSchema = new mongoose.Schema(
    "name": type: String, default: "Human", enum: ['Human', 'NONE-Human'],
    "age": type: Number, defualt:20
);

更新 1

如果我有 20 个字段要检查它们是否设置为 null,我是否必须对所有字段重复 this.field = default?

我猜你必须这样做。

枚举中的 NONE-Human 是做什么的?我在网上找不到这方面的文档。

这只是带有枚举的 ENUM 示例,您可以选择 ENUM 中指定的值,即“名称”只能具有“人类”或“无人类”的值。 p>

【讨论】:

谢谢!我有两个快速跟进的问题。 1. 如果我有 20 个字段要检查它们是否设置为 null,我是否必须对所有字段重复 this.field = default? 2. NONE-Human in enums 做什么?我在网上找不到这方面的文档。 @NeilSanghrajka 用您的问题更新了我的答案。 =) @NeilSanghrajka 如果您觉得我的帮助有用,您是否可以选择我的答案作为已接受。谢谢 不错。但是请参阅 @Ralph 的 ***.com/a/42633419/9236556 很好地概括了它【参考方案2】:

回答这个问题有点晚了,但更通用的方法是不在 pre 挂钩中再次对字段进行硬编码。

相反,让我们使用架构本身检查字段并检查具有default 值并明确设置为null 的字段。在这种情况下,我们将其设置为默认值。

PersonSchema.pre('save', function(next) 
  const self = this;
  Object.keys(this.schema.paths).forEach(function(key) 
    if(self.schema.paths[key].options.default && self[key] === null) 
      self[key] = self.schema.paths[key].options.default;
    
  );
  next();
);

【讨论】:

+1。需要注意的是 TypeScript 不喜欢“self[key]”表示法。只需使用“self.set(key, value)”和“self.get(key)”分别进行属性和获取值。【参考方案3】:

一个更晚的答案。我正在寻找一个更简单的解决方案并遇到了这个问题。我想我会分享我最终做了什么。

db.Person.create(
   name: usersName || "Human",
   age: usersAge,
)

【讨论】:

以上是关于如果字段设置为 null,则恢复为 mongoose 中的默认值的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL建表1064错误?

怎么写一个SQL语句查询 我的字段是float型的, 如何让它如果是空则显示空 如果是0则显示出来为 0

ORM字段参数

如何创建唯一索引

返回json时,字段为null的处理方式

Mongoose 为 Number 字段接受 null