MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Una panoramica della convalida dello schema MongoDB

Tutti sanno che MongoDB è senza schema, quindi perché è necessario eseguire la convalida dello schema? È facile e veloce sviluppare l'applicazione con il comportamento senza schema di MongoDB e utilizzarla come prova di concetto. Ma una volta che l'applicazione passa alla produzione e diventa stabile e matura, non è necessario modificare lo schema frequentemente e non è nemmeno consigliabile. In questo momento, è molto importante imporre una convalida dello schema nel database per evitare l'inserimento di dati indesiderati che possono interrompere l'applicazione. Questo diventa molto più importante quando i dati vengono inseriti da più origini nello stesso database.

La convalida dello schema consente di definire la struttura specifica dei documenti in ciascuna raccolta. Se qualcuno tenta di inserire dei documenti che non corrispondono allo schema definito, MongoDB può rifiutare questo tipo di operazione o dare avvisi in base al tipo di azione di validazione.

MongoDB offre due modi per convalidare lo schema, la convalida del documento e la convalida dello schema JSON. La convalida dello schema JSON è la versione estesa della convalida dei documenti, quindi iniziamo con la convalida dei documenti.

Convalida dei documenti

La maggior parte degli sviluppatori che hanno lavorato con database relazionali conoscono l'importanza della prevedibilità dei modelli di dati o dello schema. Pertanto, MongoDB ha introdotto la convalida dei documenti dalla versione 3.2. Vediamo come aggiungere regole di convalida nelle raccolte MongoDB.

Supponiamo di avere una raccolta di utenti con i seguenti tipi di documenti.

{
    "name": "Alex",
    "email": "[email protected]",
    "mobile": "123-456-7890"
} 

E, di seguito sono riportate le convalide che vogliamo controllare durante l'aggiunta di nuovi documenti nella raccolta utenti:

  • I campi nome, email sono obbligatori
  • I numeri di cellulare devono seguire una struttura specifica:xxx-xxx-xxxx

Per aggiungere questa convalida, possiamo utilizzare il costrutto "validator" durante la creazione di una nuova raccolta. Esegui la seguente query nella shell Mongo,

db.createCollection("users", {
  validator: {
        $and: [
            {
                "name": {$type: "string", $exists: true}
            },
            {
                "mobile": {$type: "string", $regex: /^[0-9]{3}-[0-9]{3}-[0-9]{4}$/}
            },
            {
                "email": {$type: "string", $exists: true}
            }
        ]
    }
})

Dovresti vedere il seguente output:

{ "ok" : 1 }

Ora, se provi ad aggiungere un nuovo documento senza seguire le regole di convalida, mongo genererà un errore di convalida. Prova a eseguire le seguenti query di inserimento.

Domanda:1

db.users.insert({
    "name": "akash"
})

Uscita:

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

Domanda:2

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890"
})

Uscita:

WriteResult({ "nInserted" : 1 })

Tuttavia, ci sono alcune restrizioni con l'approccio di convalida del documento, ad esempio è possibile aggiungere un numero qualsiasi di nuove coppie chiave-valore al documento e inserirlo nella raccolta. Questo non può essere impedito dalla convalida del documento. Considera il seguente esempio,

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890",
    "gender": "Male"
})

Uscita:

WriteResult({ "nInserted" : 1 })

A parte questo, la convalida del documento controlla solo i valori. Supponiamo, se si tenta di aggiungere il documento con "nmae"(typo) come chiave invece di "nome", mongo lo considererà come un nuovo campo e il documento verrà inserito nel DB. Queste cose dovrebbero essere evitate quando si lavora con il database di produzione. Per supportare tutto questo, MongoDB ha introdotto l'operatore "jsonSchema" con il costrutto "validator" dalla versione 3.6. Vediamo come aggiungere le stesse regole di convalida di cui sopra ed evitare di aggiungere campi nuovi/errati.

Multiplenines Diventa un DBA MongoDB - Portare MongoDB in produzioneScopri cosa devi sapere per distribuire, monitorare, gestire e ridimensionare MongoDBScarica gratuitamente

Convalida jsonSchema

Esegui il comando seguente in mongo shell per aggiungere le regole di convalida utilizzando l'operatore "jsonSchema".

db.runCommand(
  {
    "collMod": "users_temp",
    "validator": {
      "$jsonSchema": {
        "bsonType": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "email"
        ],
        "properties": {
          "_id": {},
          "name": {
            "bsonType": "string"
          },
          "email": {
            "bsonType": "string"
          },
          "mobile": {
            "bsonType": "string",
            "pattern": "^[0-9]{3}-[0-9]{3}-[0-9]{4}$"
          }
        }
      }
    }
  })

Vediamo ora cosa succede quando proviamo a inserire il seguente documento.

db.users.insert({
    "name": "akash",
    "email": "[email protected]",
    "mobile": "123-456-7890",
    "gender": "Male"
})

Verrà generato un errore poiché non abbiamo definito il campo del genere in "jsonSchema".

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

Allo stesso modo, se hai errori di battitura nei nomi dei campi, mongo genererà lo stesso errore.

Lo schema sopra definito è lo stesso che abbiamo utilizzato nella convalida dei documenti. Inoltre, abbiamo aggiunto il campo "additionalProperties" per evitare errori di battitura nei nomi dei campi e l'aggiunta di nuovi campi nei documenti. Consentirà solo i campi definiti nel campo "proprietà". Ecco la panoramica di alcune proprietà che possiamo utilizzare con l'operatore "jsonSchema".

  • bsonType:array | oggetto | stringa | booleano | numero | nullo
  • richiesto:un array di tutti i campi obbligatori
  • enum:un array di soli valori possibili per qualsiasi campo
  • minimo:valore minimo del campo
  • massimo:valore massimo del campo
  • minLength:lunghezza minima del campo
  • mixLength:lunghezza massima del campo
  • proprietà:una raccolta di schemi JSON validi
  • additionalProperties:ci impedisce di aggiungere altri campi oltre a quelli menzionati nel campo delle proprietà
  • titolo:titolo per qualsiasi campo.
  • descrizione:breve descrizione per qualsiasi campo.

Oltre alla convalida dello schema, l'operatore "jsonSchema" può essere utilizzato anche nella fase di ricerca e corrispondenza all'interno della pipeline di aggregazione.

Conclusione

Le convalide di documenti/schemi non sono richieste o auspicabili in tutte le situazioni, ma in generale è una buona pratica aggiungerle al database poiché aumenterà la produttività degli sviluppatori che si occupano del tuo database. Sapranno che tipo di risposta aspettarsi dal database poiché non ci saranno dati casuali.

In questo articolo abbiamo appreso l'importanza della convalida dello schema in MongoDB e come aggiungere convalide a livello di documento utilizzando la convalida del documento e l'operatore "jsonSchema".