Utilizzo della convalida dello schema JSON - Amazon DocumentDB

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo della convalida dello schema JSON

Utilizzando l'operatore di interrogazione di $jsonSchema valutazione, puoi convalidare i documenti inseriti nelle tue raccolte.

Creazione e utilizzo della convalida dello schema JSON

Creazione di una raccolta con convalida dello schema

È possibile creare una raccolta con regole createCollection operative e di convalida. Queste regole di convalida vengono applicate durante gli inserimenti o gli aggiornamenti dei documenti Amazon DocumentDB. Il seguente esempio di codice mostra le regole di convalida per un insieme di dipendenti:

db.createCollection("employees", { "validator": { "$jsonSchema": { "bsonType": "object", "title": "employee validation", "required": [ "name", "employeeId"], "properties": { "name": { "bsonType": "object", "properties": { "firstName": { "bsonType": ["string"] }, "lastName": { "bsonType": ["string"] } }, "additionalProperties" : false }, "employeeId": { "bsonType": "string", "description": "Unique Identifier for employee" }, "salary": { "bsonType": "double" }, "age": { "bsonType": "number" } }, "additionalProperties" : true } }, "validationLevel": "strict", "validationAction": "error" } )

Inserimento di un documento valido

L'esempio seguente inserisce documenti conformi alle regole di convalida dello schema di cui sopra:

db.employees.insert({"name" : { "firstName" : "Carol" , "lastName" : "Smith"}, "employeeId": "c720a" , "salary": 1000.0 }) db.employees.insert({ "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24})

Inserimento di un documento non valido

L'esempio seguente inserisce documenti che non sono conformi alle regole di convalida dello schema di cui sopra. In questo esempio, il valore EmployeeID non è una stringa:

db.employees.insert({ "name" : { "firstName" : "Carol" , "lastName" : "Smith"}, "employeeId": 720 , "salary": 1000.0 })

Questo esempio mostra una sintassi errata all'interno del documento.

Modifica di una raccolta

Il collMod comando viene utilizzato per aggiungere o modificare le regole di convalida della raccolta esistente. L'esempio seguente aggiunge un campo stipendio all'elenco dei campi obbligatori:

db.runCommand({"collMod" : "employees", "validator": { "$jsonSchema": { "bsonType": "object", "title": "employee validation", "required": [ "name", "employeeId", "salary"], "properties": { "name": { "bsonType": "object", "properties": { "firstName": { "bsonType": ["string"] }, "lastName": { "bsonType": ["string"] } }, "additionalProperties" : false }, "employeeId": { "bsonType": "string", "description": "Unique Identifier for employee" }, "salary": { "bsonType": "double" }, "age": { "bsonType": "number" } }, "additionalProperties" : true } } } )

Indirizzare i documenti aggiunti prima della modifica delle regole di convalida

Per indirizzare i documenti che sono stati aggiunti alla tua raccolta prima della modifica delle regole di convalida, utilizza i seguenti validationLevel modificatori:

  • strict: applica le regole di convalida a tutti gli inserti e gli aggiornamenti.

  • moderate: applica le regole di convalida ai documenti validi esistenti. Durante gli aggiornamenti, i documenti non validi esistenti non vengono controllati.

Nell'esempio seguente, dopo aver aggiornato le regole di convalida sulla raccolta denominata «dipendenti», il campo stipendio è obbligatorio. L'aggiornamento del seguente documento avrà esito negativo:

db.runCommand({ update: "employees", updates: [{ q: { "employeeId": "c721a" }, u: { age: 25 , salary : 1000}, upsert: true }] })

Amazon DocumentDB restituisce il seguente output:

{ "n" : 0, "nModified" : 0, "writeErrors" : [ { "index" : 0, "code" : 121, "errmsg" : "Document failed validation" } ], "ok" : 1, "operationTime" : Timestamp(1234567890, 1) }

L'aggiornamento del livello di convalida per moderate consentire l'aggiornamento corretto del documento precedente:

db.runCommand({ "collMod" : "employees", validationLevel : "moderate" }) db.runCommand({ update: "employees", updates: [{ q: { "employeeId": "c721a" }, u: { age: 25 , salary : 1000}, upsert: true }] })

Amazon DocumentDB restituisce il seguente output:

{ "n" : 1, "nModified" : 1, "ok" : 1, "operationTime" : Timestamp(1234567890, 1) }

Recupero di documenti con $jsonSchema

L'$jsonSchemaoperatore può essere utilizzato come filtro per interrogare i documenti che corrispondono allo schema JSON. Si tratta di un operatore di primo livello che può essere presente nei documenti di filtro come campo di primo livello o utilizzato con operatori di query come $and$or, e. $nor Gli esempi seguenti mostrano l'uso di $JsonSchema come filtro singolo e con altri operatori di filtro:

Documento inserito in una raccolta di «dipendenti»:

{ "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 } { "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 } { "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 } { "name" : { "firstName" : "Jane", "lastName" : "Doe" }, "employeeId" : "c721a", "salary" : 1300 }

Raccolta filtrata solo con l'$jsonSchemaoperatore:

db.employees.find({ $jsonSchema: { required: ["age"] } })

Amazon DocumentDB restituisce il seguente output:

{ "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 } { "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }

Raccolta filtrata con l'$jsonSchemaoperatore e un altro operatore:

db.employees.find({ $or: [{ $jsonSchema: { required: ["age", "name"]}}, { salary: { $lte:1000}}]});

Amazon DocumentDB restituisce il seguente output:

{ "_id" : ObjectId("64e5f8886218c620cf0e8f8a"), "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 } { "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 } { "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 }

Raccolta filtrata con l'$jsonSchemaoperatore e all'$matchinterno del filtro aggregato:

db.employees.aggregate( [{ $match: { $jsonSchema: { required: ["name", "employeeId"], properties: {"salary" :{"bsonType": "double"}} } } }] )

Amazon DocumentDB restituisce il seguente output:

{ "_id" : ObjectId("64e5f8886218c620cf0e8f8a"), "name" : { "firstName" : "Carol", "lastName" : "Smith" }, "employeeId" : "c720a", "salary" : 1000 } { "_id" : ObjectId("64e5f91c6218c620cf0e8f8b"), "name" : { "firstName" : "Emily", "lastName" : "Brown" }, "employeeId" : "c720b", "age" : 25, "salary" : 1050.2 } { "_id" : ObjectId("64e5f94e6218c620cf0e8f8c"), "name" : { "firstName" : "William", "lastName" : "Taylor" }, "employeeId" : "c721a", "age" : 24, "salary" : 1400.5 } { "_id" : ObjectId("64e5f9786218c620cf0e8f8d"), "name" : { "firstName" : "Jane", "lastName" : "Doe" }, "employeeId" : "c721a", "salary" : 1300 }

Visualizzazione delle regole di convalida esistenti

Per visualizzare le regole di convalida esistenti su una raccolta, usa:

db.runCommand({ listCollections: 1, filter: { name: 'employees' } })

Amazon DocumentDB restituisce il seguente output:

{ "waitedMS" : NumberLong(0), "cursor" : { "firstBatch" : [ { "name" : "employees", "type" : "collection", "options" : { "autoIndexId" : true, "capped" : false, "validator" : { "$jsonSchema" : { "bsonType" : "object", "title" : "employee validation", "required" : [ "name", "employeeId", "salary" ], "properties" : { "name" : { "bsonType" : "object", "properties" : { "firstName" : { "bsonType" : [ "string" ] }, "lastName" : { "bsonType" : [ "string" ] } }, "additionalProperties" : false }, "employeeId" : { "bsonType" : "string", "description" : "Unique Identifier for employee" }, "salary" : { "bsonType" : "double" }, "age" : { "bsonType" : "number" } }, "additionalProperties" : true } }, "validationLevel" : "moderate", "validationAction" : "error" }, "info" : { "readOnly" : false }, "idIndex" : { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.employees" } } ], "id" : NumberLong(0), "ns" : "test.$cmd.listCollections" }, "ok" : 1, "operationTime" : Timestamp(1692788937, 1) }

Amazon DocumentDB mantiene anche le regole di convalida nella fase di aggregazione. $out

Parole chiave supportate

I seguenti campi sono supportati nei collMod comandi create and:

  • Validator— Supporta l'operatore $jsonSchem a.

  • ValidationLevel— Supporti off strict e moderate valori.

  • ValidationAction— Supporta il error valore.

L'operatore $JsonSchema supporta le seguenti parole chiave:

  • additionalItems

  • additionalProperties

  • allOf

  • anyOf

  • bsonType

  • dependencies

  • description

  • enum

  • exclusiveMaximum

  • exclusiveMinimum

  • items

  • maximum

  • minimum

  • maxItems

  • minItems

  • maxLength

  • minLength

  • maxProperties

  • minProperties

  • multipleOf

  • not

  • oneOf

  • pattern

  • patternProperties

  • properties

  • required

  • title

  • type

  • uniqueItems

bypassDocumentValidation

Amazon DocumentDB supporta bypassDocumentValidation i seguenti comandi e metodi:

  • insert

  • update

  • findAndModify

  • $outstage nel aggregate comando e nel metodo db.collection.aggregate()

Amazon DocumentDB non supporta i seguenti comandi per: bypassDocumentValidation

  • $mergenel aggregate comando e nel metodo db.collection.aggregate()

  • mapReducecomando e db.collection.mapReduce() metodo

  • Comando applyOps

Limitazioni

Le seguenti limitazioni si applicano alla $jsonSchema convalida:

  • Amazon DocumentDB restituisce l'errore «Document failed validation» quando un'operazione non soddisfa la regola di convalida.

  • I cluster elastici di Amazon DocumentDB non sono supportati. $jsonSchema