MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment valider les clés et les valeurs des objets dans Mongoose Schema ?

Option 1 (avec "dictionnaires") : Vous pouvez utiliser l'Object constructeur en tant que SchemaType pour utiliser un objet au lieu d'un tableau d'objets. Voici un exemple qui s'applique à votre situation en utilisant SchemaType#validate :

offersInCategory: {
  type: Object,
  validate: object => { //our custom validator, object is the provided object
    let allowedKeys = ['Furniture', 'Household', 'Electronicts', 'Other'];
    let correctKeys = Object.keys(object).every(key => allowedKeys.includes(key)); //make sure all keys are inside `allowedKeys`

    let min = 5;
    let max = 10;
    let correctValues = Object.values(object).every(value => value > min && value < max); //make sure all values are in correct range

    return correctKeys && correctValues; //return true if keys and values pass validation
  }
}

Cela n'applique pas les vérifications de clés en double car un objet ne peut pas avoir de clés en double , la dernière clé présente remplace simplement la clé précédente :

> let foo = { bar: 4, bar: 5}
< Object { bar: 5 }

Comme vous pouvez le voir, la bar: 4 la clé qui est attribuée plus tôt est remplacée par la clé la plus récente.

Option 2 (avec tableau) : Vous pouvez utiliser SchemaType#validate pour implémenter votre validation personnalisée sur un certain chemin de document. Voici un exemple de ce que vous voulez :

offersInCategory: [{
  validate: {
    validator: array => { //our custom validator, array is the provided array to be validated
      let filtered = array.filter((obj, index, self) => self.findIndex(el => el.category === obj.category) === index); //this removes any duplicates based on object key
      return array.length === filtered.length; //returns true if the lengths are the same; if the lengths aren't the same that means there was a duplicate key and validation fails
    },
    message: 'Detected duplicate keys in {VALUE}!'
  }
  category: {
    type: String, 
    enum: ['Furniture', 'Household', 'Electronicts', 'Other'] //category must be in this enum
  },
  val: {
    type: Number, 
    min: 0, //minimum allowed number is 0
    max: 10 //maximum allowed number is 10
  }
}]

Et si vous testez cela, il se débarrassera des objets du tableau avec des clés en double (en gardant la précédente) et vérifiera si le tableau ne contient que des objets avec une category unique clés.