Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / / /

$jsonSchema

Nesta página

  • Definição
  • Comportamento
  • Exemplos
  • JSON schema
$jsonSchema

O operador $jsonSchema corresponde a documentos que satisfazem o JSON schema especificado.

A expressão do operador $jsonSchema tem a seguinte sintaxe:

{ $jsonSchema: <JSON Schema object> }

Quando o objeto de JSON schema é formatado de acordo com o rascunho 4 do padrão de JSON schema.

{ <keyword1>: <value1>, ... }

Por exemplo:

{
$jsonSchema: {
required: [ "name", "major", "gpa", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
address: {
bsonType: "object",
required: [ "zipcode" ],
properties: {
"street": { bsonType: "string" },
"zipcode": { bsonType: "string" }
}
}
}
}
}

Para obter uma lista de palavras-chave suportadas pelo MongoDB, consulte Palavras-chave disponíveis.

Observação

O MongoDB suporta o 4 rascunho do JSON schema, incluindo a especificação principal e especificação de validação , com algumas diferenças. Consulte Extensões e Omissões para obter detalhes.

Para mais informações sobre JSON schema, consulte o site oficial.

OfeatureCompatibilityVersion deve ser definido como "3.6" superior para usar o $jsonSchema.

Você pode usar $jsonSchema em um validador de documento para impor o esquema especificado nas operações de inserção e atualização:

db.createCollection( <collection>, { validator: { $jsonSchema: <schema> } } )
db.runCommand( { collMod: <collection>, validator:{ $jsonSchema: <schema> } } )

Você pode usar $jsonSchema em condições de query para operações de leitura e gravação para localizar documentos na coleção que satisfaçam o esquema especificado:

db.collection.find( { $jsonSchema: <schema> } )
db.collection.aggregate( [ { $match: { $jsonSchema: <schema> } } ] )
db.collection.updateMany( { $jsonSchema: <schema> }, <update> )
db.collection.deleteOne( { $jsonSchema: <schema> } )

Para localizar documentos na coleção que não satisfazem o esquema especificado, utilize a expressão $jsonSchema em uma expressão $nor . Por exemplo:

db.collection.find( { $nor: [ { $jsonSchema: <schema> } ] } )
db.collection.aggregate( [ { $match: { $nor: [ { $jsonSchema: <schema> } ] } }, ... ] )
db.collection.updateMany( { $nor: [ { $jsonSchema: <schema> } ] }, <update> )
db.collection.deleteOne( { $nor: [ { $jsonSchema: <schema> } ] } )

O método db.createCollection() a seguir cria uma collection chamada students e usa o operador $jsonSchema para definir regras de validação de esquema:

db.createCollection("students", {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double if the field exists"
},
address: {
bsonType: "object",
required: [ "city" ],
properties: {
street: {
bsonType: "string",
description: "must be a string if the field exists"
},
city: {
bsonType: "string",
"description": "must be a string and is required"
}
}
}
}
}
}
} )

Dado o validator criado para a collection, a seguinte operação de inserção falhará porque gpa é um número inteiro quando o validator exige um double.

db.students.insertOne( {
name: "Alice",
year: Int32( 2019 ),
major: "History",
gpa: Int32( 3 ),
address: {
city: "NYC",
street: "33rd Street"
}
} )

A operação retorna o seguinte erro:

MongoServerError: Document failed validation
Additional information: {
failingDocumentId: ObjectId("61aa577f666a50a8fccd7ec2"),
details: {
operatorName: '$jsonSchema',
schemaRulesNotSatisfied: [
{
operatorName: 'properties',
propertiesNotSatisfied: [
{
propertyName: 'gpa',
description: 'must be a double if the field exists',
details: [ [Object] ]
}
]
}
]
}
}

Depois de alterar o gpa para um duplo, a inserção é bem-sucedida:

db.students.insertOne( {
name: "Alice",
year: NumberInt(2019),
major: "History",
gpa: Double(3.0),
address: {
city: "NYC",
street: "33rd Street"
}
} )

Você pode usar $jsonSchema em condições de query para operações de leitura e gravação para localizar documentos na coleção que satisfaçam o esquema especificado.

Por exemplo, criar uma collection de amostra inventory com os seguintes documentos:

db.inventory.insertMany( [
{ item: "journal", qty: NumberInt(25), size: { h: 14, w: 21, uom: "cm" }, instock: true },
{ item: "notebook", qty: NumberInt(50), size: { h: 8.5, w: 11, uom: "in" }, instock: true },
{ item: "paper", qty: NumberInt(100), size: { h: 8.5, w: 11, uom: "in" }, instock: 1 },
{ item: "planner", qty: NumberInt(75), size: { h: 22.85, w: 30, uom: "cm" }, instock: 1 },
{ item: "postcard", qty: NumberInt(45), size: { h: 10, w: 15.25, uom: "cm" }, instock: true },
{ item: "apple", qty: NumberInt(45), status: "A", instock: true },
{ item: "pears", qty: NumberInt(50), status: "A", instock: true }
] )

Em seguida, defina o seguinte objeto de esquema de exemplo:

let myschema = {
required: [ "item", "qty", "instock" ],
properties: {
item: { bsonType: "string" },
qty: { bsonType: "int" },
size: {
bsonType: "object",
required: [ "uom" ],
properties: {
uom: { bsonType: "string" },
h: { bsonType: "double" },
w: { bsonType: "double" }
}
},
instock: { bsonType: "bool" }
}
}

Você pode utilizar o $jsonSchema para encontrar todos os documentos na coleção que satisfazem o esquema:

db.inventory.find( { $jsonSchema: myschema } )
db.inventory.aggregate( [ { $match: { $jsonSchema: myschema } } ] )

Você pode usar $jsonSchema com $nor para encontrar todos os documentos que não satisfazem o esquema:

db.inventory.find( { $nor: [ { $jsonSchema: myschema } ] } )

Ou você pode atualizar todos os documentos que não satisfazem o esquema:

db.inventory.updateMany( { $nor: [ { $jsonSchema: myschema } ] }, { $set: { isValid: false } } )

Ou você pode excluir todos os documentos que não satisfazem o esquema:

db.inventory.deleteMany( { $nor: [ { $jsonSchema: myschema } ] } )

O MongoDB suporta o 4 rascunho do JSON schema, incluindo a especificação principal e especificação de validação , com algumas diferenças. Consulte Extensões e Omissões para obter detalhes.

Para mais informações sobre JSON schema, consulte o site oficial.

Observação

O MongoDB implementa um subconjunto de palavras-chave disponíveis no JSON schema. Para obter uma lista completa das omissões, consulte Omissões.

Keyword
Tipo
Definição
Comportamento
bsonType
todos os tipos
alias de string ou array de aliases de string
Aceita os mesmos aliases de string usados para o operador $type
enum
todos os tipos
array de valores
Enumera todos os valores possíveis do campo
type
todos os tipos
string ou array de strings exclusivas

Enumera os possíveis tipos de JSON do campo. Os tipos disponíveis são "object", "array", "number", "boolean", "string" e "null".

A implementação do JSON schema do MongoDB não oferece suporte ao tipo "integer". Use a palavra-chave bsonType e os tipos "int" ou "long".

allOf
todos os tipos
array de objetos de JSON schema
O campo deve corresponder a todos os esquemas especificados
anyOf
todos os tipos
array de objetos de JSON schema
O campo deve corresponder a pelo menos um dos esquemas especificados
oneOf
todos os tipos
array de objetos de JSON schema
O campo deve corresponder exatamente a um dos esquemas especificados
não
todos os tipos
um objeto de JSON schema
O campo não deve corresponder ao esquema
multipleOf
números
número
O campo deve ser um múltiplo deste valor
maximum
números
número
Indica o valor máximo do campo
exclusiveMaximum
números
booleano
Se true e campo for um número, maximum é um máximo exclusivo. Caso contrário, é um máximo inclusivo.
minimum
números
número
Indica o valor mínimo do campo
exclusiveMinimum
números
booleano
Se true, minimum é um mínimo exclusivo. Caso contrário, é um mínimo inclusivo.
maxLength
strings
inteiro
Indica o comprimento máximo do campo
minLength
strings
inteiro
Indica o comprimento mínimo do campo
padrão
strings
string que contém um regex
O campo deve corresponder à expressão regular
maxProperties
objetos
inteiro
Indica o número máximo de propriedades do campo
minProperties
objetos
inteiro
Indica o número mínimo de propriedades do campo
necessário
objetos
array de strings exclusivas
O conjunto de propriedades do objeto deve conter todos os elementos especificados na array
Propriedades adicionais
objetos
booleano ou objeto

Se true, são permitidos campos adicionais. Se false, não são. Se um objeto de JSON schema válido for especificado, campos adicionais deverão ser validados em relação ao esquema.

Padrão é true.

properties
objetos
objeto
Um JSON schema válido onde cada valor também é um objeto de JSON schema válido
patternProperties
objetos
objeto
Além dos requisitos de properties, cada nome de propriedade deste objeto deve ser uma expressão regular válida
dependencies
objetos
objeto
Descreve dependências de campo ou esquema
additionalItems
arrays
booleano ou objeto
Se for um objeto, deve ser um JSON schema válido
items
arrays
objeto ou array
Deve ser um JSON schema válido ou uma array de JSON schemas válidos
maxItems
arrays
inteiro
Indica o comprimento máximo da array
minItems
arrays
inteiro
Indica o comprimento mínimo da array
uniqueItems
arrays
booleano
Se true, cada item na array deverá ser exclusivo. Caso contrário, nenhuma restrição de exclusividade será imposta.
title
N/A
string
Uma string de título descritiva sem efeito.
Descrição
N/A
string
Uma string que descreve o esquema e não tem efeito.

A implementação do JSON schema do MongoDB inclui a adição da palavra-chave bsonType , que permite usar todos os tipos BSON no operador $jsonSchema . bsonType aceita os mesmos aliases de string usados para o operador $type .

O seguinte não é permitido na implementação do JSON schema do MongoDB:

  • Definições de hipertexto no rascunho 4 da especificação do JSON schema.

  • As palavras-chave:

    • $ref

    • $schema

    • default

    • definitions

    • format

    • id

  • O tipo integer. Você deve usar o tipo BSON int ou long com a palavra-chave bsonType.

  • Hipermídia e propriedades de vinculação do JSON schema, incluindo o uso de referências JSON e ponteiros JSON.

  • Palavras-chave desconhecidas.

Voltar

$expr