sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur validerar man objektnycklar och värden i Mongoose Schema?

Alternativ 1 (med "ordböcker"): Du kan använda Object konstruktor som en SchemaType för att använda ett objekt istället för en array av objekt. Här är ett exempel som gäller din situation med 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
  }
}

Detta tillämpar inte dubblettnyckelkontroller eftersom ett objekt inte kan ha dubbletter av nycklar , den senare nyckeln som finns åsidosätter bara den föregående nyckeln:

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

Som du kan se, bar: 4 tangent som tilldelas tidigare åsidosätts av den senare tangenten.

Alternativ 2 (med array): Du kan använda SchemaType#validate för att implementera din anpassade validering på en viss dokumentsökväg. Här är ett exempel på vad du vill ha:

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

Och om du testar detta kommer den att bli av med objekt i arrayen med dubblettnycklar (behåller den tidigare) och kontrollerar om arrayen bara innehåller objekt med unik category nycklar.




  1. MongoDB och stora datamängder när du använder ett arkivmönster

  2. dynamisk länk direktanropssegmenteringsfel vid körning av en app kompilerad med anpassad gcc

  3. MongoDB verkar välja fel index när man gör aggregering

  4. Introduktion till Redis Data Structures:Sets