Especifique valores de campo permitidos
Ao criar um JSON schema, você pode especificar quais valores são permitidos em um determinado campo. Use essa funcionalidade para garantir que os valores de seu campo pertençam a um conjunto esperado de valores, como uma lista de países. Da mesma forma, você pode usar essa funcionalidade para evitar erros humanos, como erros de digitação, ao inserir dados em uma collection.
Contexto
Para especificar uma lista de valores permitidos, utilize a palavra-chave enum
no seu JSON schema. A palavra-chave enum
significa "enumerar" e é usada para listar possíveis valores de um campo.
Passos
Considere uma empresa de vestuário que só envia produtos para França, Reino Unido e Estados Unidos. No validador, você pode listar os valores de país permitidos e rejeitar documentos que especificam um país diferente.
Crie uma collection com validação contendo enum
.
Crie uma coleção shipping
e use o operador $jsonSchema
para definir regras de validação de esquema:
db.createCollection("shipping", { validator: { $jsonSchema: { bsonType: "object", title: "Shipping Country Validation", properties: { country: { enum: [ "France", "United Kingdom", "United States" ], description: "Must be either France, United Kingdom, or United States" } } } } } )
O campo enum
no objeto country
permite apenas documentos onde o campo country
é France
, United
Kingdom
ou United States
.
Confirme se a validação impede documentos inválidos.
A seguinte operação de inserção falha porque country
é Germany
, que não está na lista de valores permitidos.
db.shipping.insertOne( { item: "sweater", size: "medium", country: "Germany" } )
A operação retorna este erro:
MongoServerError: Document failed validation Additional information: { failingDocumentId: ObjectId("630d1057931191850b40d0aa"), details: { operatorName: '$jsonSchema', title: 'Shipping Country Validation', schemaRulesNotSatisfied: [ { operatorName: 'properties', propertiesNotSatisfied: [ { propertyName: 'country', description: 'Must be either France, United Kingdom, or United States', details: [ { operatorName: 'enum', specifiedAs: { enum: [ 'France', 'United Kingdom', 'United States' ] }, reason: 'value was not found in enum', consideredValue: 'Germany' } ] } ] } ] } }