防止保存空文档

时间:2016-11-29 07:13:00

标签: node.js mongodb mongoose

我使用带有三个字段的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);

3 个答案:

答案 0 :(得分:0)

如上所述,您可以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);

答案 1 :(得分:0)

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'))
    } 
}

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

答案 2 :(得分:-1)

您可以为字段输入为空时使用的字段设置默认值。

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);