sql >> データベース >  >> NoSQL >> MongoDB

Mongooseスキーマでオブジェクトのキーと値を検証する方法は?

    オプション1(「辞書」付き): Objectを使用できます オブジェクトの配列の代わりにオブジェクトを使用するためのSchemaTypeとしてのコンストラクター。これは、 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
      }
    }
    

    オブジェクトは重複キーを持つことができないため、これは重複キーチェックを適用しません 、存在する後のキーは前のキーを上書きするだけです:

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

    ご覧のとおり、bar: 4 以前に割り当てられたキーは、後のキーによって上書きされます。

    オプション2(アレイ付き): SchemaType#validateを使用できます 特定のドキュメントパスにカスタム検証を実装します。必要なものの例を次に示します。

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

    これをテストすると、重複するキーを持つ配列内のオブジェクトが削除され(以前のキーは保持されます)、配列が一意のcategoryを持つオブジェクトのみを保持しているかどうかを確認します。 キー。




    1. Mongo/Mongoose-日付で集計

    2. 一度に複数のインデックスを作成する

    3. JavaEEWebサービス全体で単一のMongoClientを使用する

    4. 重複する配列をフィルターで除外し、mongodbアグリゲーションで一意の配列を返します