【问题标题】:prevent empty document from being saved防止保存空文档
【发布时间】:2016-11-29 18:52:45
【问题描述】:

我有一个使用 Mongoose 的架构设置,其中包含三个字段。其中一个不是必需的,但我想确保至少填充三个字段中的一个以防止保存空文档(实际上我想确保至少填充 firstsecond 字段) .最好的方法是什么? pre('save') 看起来像一个选项,但认为应该有一个内置的方法来做到这一点。

var mySchema = new Schema({
  first: {
    type: String,
    trim: true
  },
  second: {
    type: String,
    trim: true
  },
  third: {
    type: Number,
    min: 1
  }
}, {
  timestamps: true
});

var My = mongoose.model('My', mySchema);

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您可以使用pre('save') 或在一个字段上使用validation 来检查此情况,如下所示。

    var validateLocalStrategyProperty = function(property) {
        return this.first || this.second || this.third);
    };
    
    var mySchema = new Schema({
      first: {
        type: String,
        trim: true,
        validate: [validateLocalStrategyProperty, 'Please fill at least one field']
      },
      second: {
        type: String,
        trim: true
      },
      third: {
        type: Number,
        min: 1
      }
    }, {
      timestamps: true
    });
    
    var My = mongoose.model('My', mySchema);
    

    【讨论】:

    • 有趣。你知道什么是最佳实践吗?
    • 您可以进行验证,因为它可以更好地控制每个字段
    • 每次保存文档时都会进行验证检查,.pre() 仅针对该特定查询进行。
    【解决方案2】:

    Pre 方法最适合这种用例。

    mySchema.pre('save', function(next) {
      var self = this;
      if(self.first || self.second || self.third) {
        next();
      } else {
          next(new Error('At leat one of the filed should be there'))
        } 
    }
    

    您已经引入了一个中间件,该中间件将验证您的请求并调用路由中的下一个函数。

    【讨论】:

    • 永远不要只在客户端做事,总是检查服务器中的东西,因为客户端可以被利用!!!
    • 是的,你是对的,在这种情况下编写中间件函数是最好的。避免客户端处理
    • 我总是两者都做,以避免等待服务器的响应,但绝不只在客户端。
    【解决方案3】:

    您可以为字段设置一个默认值,当字段输入为空时将使用该值。

    var mySchema = new Schema({
    first: {
      type: String,
      trim: true,
      default: 'your string or something'
    },
    second: {
      type: String,
      trim: true,
      default: 'your string or something'
    },
    third: {
      type: Number,
      min: 1
    }
    }, {
    timestamps: true
    });
    
    var My = mongoose.model('My', mySchema);
    

    【讨论】:

    • 谢谢,但如果firstsecond 都是空的,我根本不想保存它。
    • 好的,那么您可以使用 Aruna 的回答中提到的 validate 选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多