sql >> Database >  >> NoSQL >> MongoDB

Hoe objectsleutels en waarden in Mongoose Schema valideren?

Optie 1 (met "woordenboeken"): U kunt het Object . gebruiken constructor als SchemaType om een ​​object te gebruiken in plaats van een array van objecten. Hier is een voorbeeld dat van toepassing is op uw situatie met behulp van 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
  }
}

Dit past geen dubbele sleutelcontroles toe omdat een object geen dubbele sleutels mag hebben , de latere aanwezige sleutel overschrijft gewoon de vorige sleutel:

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

Zoals je kunt zien, is de bar: 4 sleutel die eerder is toegewezen, wordt overschreven door de latere sleutel.

Optie 2 (met array): U kunt SchemaType#validate gebruiken om uw aangepaste validatie op een bepaald documentpad te implementeren. Hier is een voorbeeld van wat je wilt:

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
  }
}]

En als je dit test, verwijdert het objecten in de array met dubbele sleutels (de eerdere behouden) en controleert het of de array alleen objecten bevat met een unieke category toetsen.




  1. Opmerking:Ongedefinieerde eigenschap:MongoId

  2. Vijf tips voor betere MongoDB-hosting op Azure

  3. Kan Mongodb niet verbinden met Springboot Container in docker

  4. MongoDB 2.6 Update-fout