【问题标题】:Revert to default value in mongoose if field is set to null如果字段设置为 null,则恢复为 mongoose 中的默认值
【发布时间】: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 实现这一点。

【问题讨论】:

    标签: node.js mongodb mongoose null mean-stack


    【解决方案1】:

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

    PRE-SAVE/PRE-VALIDATE 挂钩

    Mongoose Middleware hooks

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

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

    枚举

    Mongoose ValidationMongoose 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 的 stackoverflow.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,
    })
    

    【讨论】:

      猜你喜欢
      • 2022-06-19
      • 2017-12-05
      • 1970-01-01
      • 2013-12-08
      • 2018-05-04
      • 2018-02-12
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多