sql >> Databasteknik >  >> NoSQL >> MongoDB

En översikt över MongoDB Schema Validering

Alla vet att MongoDB är schemalöst, varför krävs det då att utföra schemavalidering? Det är enkelt och snabbt att utveckla applikationen med MongoDB:s schemalösa beteende och använda den som ett proof of concept. Men när applikationen flyttas till produktion och blir stabil och mogen, finns det inget behov av att ändra schemat ofta och det är inte heller tillrådligt. För närvarande är det mycket viktigt att genomdriva viss schemavalidering i din databas för att undvika att oönskad data infogas som kan skada din applikation. Detta blir mycket viktigare när data infogas från flera källor i samma databas.

Schemavalidering låter dig definiera den specifika strukturen för dokument i varje samling. Om någon försöker infoga några dokument som inte matchar det definierade schemat, kan MongoDB avvisa denna typ av operation eller ge varningar beroende på typen av valideringsåtgärd.

MongoDB tillhandahåller två sätt att validera ditt schema, dokumentvalidering och JSON-schemavalidering. JSON Schema validering är den utökade versionen av dokumentvalidering, så låt oss börja med dokumentvalidering.

Dokumentvalidering

De flesta av de utvecklare som har arbetat med relationsdatabaser känner till vikten av förutsägbarhet i datamodellerna eller schemat. Därför introducerade MongoDB dokumentvalidering från version 3.2. Låt oss se hur man lägger till valideringsregler i MongoDB-samlingar.

Anta att du har en samling användare som har följande typer av dokument.

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

Och följande är valideringarna som vi vill kontrollera när vi lägger till nya dokument i användarens samling:

  • namn, e-postfält är obligatoriska
  • mobilnummer bör följa specifik struktur:xxx-xxx-xxxx

För att lägga till denna validering kan vi använda "validator"-konstruktionen när vi skapar en ny samling. Kör följande fråga i Mongo-skal,

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

Du bör se följande utdata:

{ "ok" : 1 }

Nu, om du försöker lägga till något nytt dokument utan att följa valideringsreglerna kommer mongo att skicka ett valideringsfel. Försök att köra följande infogningsfrågor.

Fråga:1

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

Utdata:

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

Fråga:2

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

Utdata:

WriteResult({ "nInserted" : 1 })

Det finns dock vissa begränsningar med dokumentvalideringsmetoden, som att man kan lägga till valfritt antal nya nyckel-värdepar till dokumentet och infoga det i samlingen. Detta kan inte förhindras genom dokumentvalidering. Tänk på följande exempel,

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

Utdata:

WriteResult({ "nInserted" : 1 })

Utöver detta kontrollerar dokumentvalideringen endast värdena. Anta att om du försöker lägga till dokumentet med "nmae"(typo) som nyckel istället för "namn", kommer mongo att betrakta det som ett nytt fält och dokumentet kommer att infogas i DB. Dessa saker bör undvikas när du arbetar med produktionsdatabasen. För att stödja allt detta introducerade MongoDB operatorn "jsonSchema" med "validator"-konstruktion från version 3.6. Låt oss se hur du lägger till samma valideringsregler som ovan och undviker att lägga till nya/felstavade fält.

Severalnines Become a MongoDB DBA - Bringing MongoDB to ProductionLäs om vad du behöver veta för att distribuera, övervaka, hantera och skala MongoDBDownload gratis

jsonSchema-validering

Kör följande kommando i mongo-skalet för att lägga till valideringsreglerna med operatorn "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}$"
          }
        }
      }
    }
  })

Låt oss nu se vad som händer när vi försöker infoga följande dokument.

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

Det kommer att ge ett fel eftersom vi inte har definierat könsfältet i "jsonSchema".

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

På samma sätt, om du har stavfel i några fältnamn, kommer mongo att ge samma fel.

Schemat som definieras ovan är detsamma som det som vi använde vid dokumentvalidering. Dessutom lade vi till fältet "ytterligare egenskaper" för att undvika stavfel i fältnamn och tillägg av nya fält i dokument. Det kommer endast att tillåta fält som är definierade i fältet "egenskaper". Här är en översikt över några egenskaper som vi kan använda under operatorn "jsonSchema".

  • bsonType:array | objekt | sträng | boolesk | nummer | null
  • obligatoriskt:en matris med alla obligatoriska fält
  • enum:en matris med endast möjliga värden för något fält
  • minsta:lägsta värde för fältet
  • maximum:högsta värde för fältet
  • minLängd:minsta längd på fältet
  • mixLength:maximal längd på fältet
  • egenskaper:en samling giltiga JSON-scheman
  • ytterligare egenskaper:hindrar oss från att lägga till andra fält än de som nämns under egenskapsfältet
  • titel:titel för valfritt fält.
  • beskrivning:kort beskrivning för alla fält.

Bortsett från schemavalidering kan "jsonSchema"-operatorn också användas i sök- och matchningsfasen inuti aggregeringspipelinen.

Slutsats

Dokument-/schemavalideringar är inte nödvändiga eller önskvärda i alla situationer men generellt sett är det en god praxis att lägga till dem i din databas eftersom det kommer att öka produktiviteten för utvecklare som har att göra med din databas. De kommer att veta vilken typ av svar de kan förvänta sig från databasen eftersom det inte kommer att finnas några slumpmässiga data.

I den här artikeln lärde vi oss om vikten av schemavalidering i MongoDB och hur man lägger till valideringar på dokumentnivå med hjälp av dokumentvalidering och operatorn "jsonSchema".


  1. Hur lagrar/visar jag stycken med mongodb?

  2. Hur skriver man ut mer än 20 objekt (dokument) i MongoDB:s skal?

  3. Redis filtrera efter intervall, sortera och returnera 10 först

  4. Använd 'MongoMappingContext#setAutoIndexCreation(boolean)' eller åsidosätt 'MongoConfigurationSupport#autoIndexCreation()' för att vara explicit