Thursday, 13 April 2017

how to let updatemany validate mongoose schema on every modified document ?

I 've got an issue with mongoose schema validation, while trying to validate the schema of documents modified inside a Model::updateMany (or update + mutli:true) request. I've got the schema below:

  var BusinessesSchema = new Schema({
    label: {
      type: String,
      required: true
    },
    openingDate: {
      type: Date,
      required: true
    },
    endingDate: {
      type: Date,
      validate: function(value) {
        if (this.constructor.name === 'Query') {
          // Looks like this is a validation for update request
          var doc = null;
          switch (this.op) {
            case 'update':
            case 'updateMany': {
              doc = this._update.$set;
              break;
            }
            case 'findOneAndUpdate': {
              doc = this._update;
              break;
            }
            default:
            // keep null, will throw an error
          }
          return doc.openingDate < value;
        }
        else {
          return this.openingDate < value;
        }
      }
    }
  });

I would like to access modified documents value ("this") inside endingDate::validate function to make sure that for each modified document ending Date is greater than beginning one .

Even, when using pre-hook (for update & updateMany, as below), I still do not find any way to access the modified documents value to perform my check when multi is set (or when calling updateMany).

BusinessesSchema.pre('update', function(next) {
  this.options.runValidators = true;
  this.options.context = 'query';
  next();
});

BusinessesSchema.pre('updateMany', function(next) {
  this.options.runValidators = true;
  this.options.context = 'query';
  next();
});

I probably missed something, and would really appreciate help here.



via K Ren

No comments:

Post a Comment