MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak sprawdzić poprawność kluczy i wartości obiektów w schemacie Mongoose?

Opcja 1 (ze „słownikami”): Możesz użyć Object Konstruktor jako SchemaType, aby użyć obiektu zamiast tablicy obiektów. Oto przykład, który dotyczy Twojej sytuacji przy użyciu 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
  }
}

Nie dotyczy to sprawdzania zduplikowanych kluczy, ponieważ obiekt nie może mieć zduplikowanych kluczy , późniejszy obecny klucz zastępuje poprzedni:

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

Jak widać, bar: 4 klucz przypisany wcześniej jest zastępowany przez późniejszy klucz.

Opcja 2 (z tablicą): Możesz użyć SchemaType#validate aby zaimplementować niestandardową walidację w określonej ścieżce dokumentu. Oto przykład tego, czego chcesz:

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

A jeśli to przetestujesz, pozbędzie się obiektów w tablicy ze zduplikowanymi kluczami (zachowując wcześniejszy) i sprawdzi, czy tablica zawiera tylko obiekty z unikalną category klawisze.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Uwierzytelnianie wiersza poleceń powłoki MongoDB nie powiodło się

  2. Zapobieganie wyścigom związanym z bazą danych w Node.js

  3. Przykłady sterowników mongodb-erlang Erlang

  4. Jak przechowywać duże liczby w MongoDB za pomocą Node.js

  5. Jak wyszukiwać słowo lub ciąg we wszystkich polach w dokumencie za pomocą MongoDB?