Partilhar via


$jsonSchema

O $jsonSchema operador é usado para validar documentos em relação a uma especificação de esquema JSON. Ele garante que os documentos estejam em conformidade com uma estrutura predefinida, tipos de dados e regras de validação.

Sintaxe

A sintaxe para o operador é a $isArray seguinte:

db.createCollection("collectionName", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["field1", "field2"],
      properties: {
        field1: {
          bsonType: "string",
        },
        field2: {
          bsonType: "int",
          minimum: 0,
          description: "Description of field2 requirements"
        }
      }
    }
  },
  validationLevel: "strict", // Optional: "strict" or "moderate"
  validationAction: "error"   // Optional: "error" or "warn"
})

Parâmetros

Parâmetro Description
bsonType Especifica os tipos binários JSON (BSON) que o campo deve corresponder. Aceita aliases de cadeia de caracteres usados pelo operador $type.
properties Objeto definindo regras de validação para campos específicos.
minimum/maximum Restrições numéricas para campos numéricos.
minLength/maxLength Restrições de comprimento de cadeia de caracteres.
minItems/maxItems Restrições de comprimento da matriz.
pattern Padrão de expressão regular para validação de cadeia de caracteres.
items Validação de esquema para elementos de matriz.
uniqueItems Booleano indicando se os itens de matriz devem ser exclusivos.

Palavras-chave suportadas

O Azure DocumentDB suporta as seguintes palavras-chave do Esquema JSON:

Keyword Tipo Description Usage
additionalItems arrays Esquema para itens de matriz extra Validação estendida de array
bsonType todos os tipos Extensão MongoDB - aceita aliases do tipo BSON "string", "int", "double", "object", "array", "bool", "date"
exclusiveMinimum Números Limite mínimo exclusivo Validação numérica avançada
exclusiveMaximum Números Limite máximo exclusivo Validação numérica avançada
items arrays Esquema para elementos de matriz Validação de elementos de matriz
minimum Números Restrição de valor mínimo Validação numérica
maximum Números Restrição de valor máximo Validação numérica
minItems arrays Comprimento mínimo do array Validação do tamanho do array
maxItems arrays Comprimento máximo do array Validação do tamanho do array
multipleOf Números O valor deve ser múltiplo do número especificado Restrições matemáticas
minLength cordas Comprimento mínimo da cadeia de caracteres Validação de cadeia de caracteres
maxLength cordas Comprimento máximo da cadeia de caracteres Validação de cadeia de caracteres
pattern cordas Correspondência de padrão de expressão regular Validação do formato de cadeia de caracteres
properties objetos Definir regras de validação para campos de objeto Definição de esquema para objetos aninhados
required objetos Matriz de nomes de campos obrigatórios Impor campos obrigatórios
type todos os tipos Tipos de esquema JSON padrão "object", "array", "number", "boolean", "string", "null"
uniqueItems arrays Impor elementos de matriz exclusivos Integridade dos dados

Palavras-chave não suportadas

Estas palavras-chave do esquema JSON ainda não são suportadas no Azure DocumentDB:

Keyword Tipo Motivo do não suporte Solução
additionalProperties objetos Não implementado Usar definições explícitas properties
allOf todos os tipos Operador lógico não suportado Usar validação aninhada
anyOf todos os tipos Operador lógico não suportado Usar consultas separadas
dependencies objetos Validação de dependência complexa não suportada Manipular na lógica do aplicativo
description N/A Pode não aparecer em mensagens de erro Apenas informativo
enum todos os tipos Validação de enumeração não suportada Use $in o operador em vez disso
maxProperties objetos Validação de contagem de propriedades não suportada Manipular na lógica do aplicativo
minProperties objetos Validação de contagem de propriedades não suportada Manipular na lógica do aplicativo
not todos os tipos Operador de negação não suportado Usar regras de validação positiva
oneOf todos os tipos Operador lógico não suportado Usar validação no nível do aplicativo
patternProperties objetos Não há suporte para validação de propriedade baseada em padrão Usar nomes de propriedade explícitos
title N/A Campo de metadados não processado Utilize description em vez disso

Examples

Vamos explorar exemplos práticos usando o stores conjunto de dados:

{
  "_id": "2cf3f885-9962-4b67-a172-aa9039e9ae2f",
  "name": "First Up Consultants | Bed and Bath Center - South Amir",
  "location": {
    "lat": 60.7954,
    "lon": -142.0012
  },
  "staff": {
    "totalStaff": {
      "fullTime": 18,
      "partTime": 17
    }
  },
  "sales": {
    "totalSales": 37701,
    "salesByCategory": [
      {
        "categoryName": "Mattress Toppers",
        "totalSales": 37701
      }
    ]
  }
}

Exemplo 1: Validação da estrutura básica

Esta consulta recupera todos os armazenamentos com nomes entre 5 e 100 caracteres e que as coordenadas geográficas estão dentro de intervalos válidos: latitude entre -90 e 90 e longitude entre -180 e 180.

db.stores.find({
  $jsonSchema: {
    bsonType: "object",
    properties: {
      _id: {
        bsonType: "string"
      },
      name: {
        bsonType: "string",
        minLength: 5,
        maxLength: 100
      },
      location: {
        bsonType: "object",
        properties: {
          lat: {
            bsonType: "double",
            minimum: -90,
            maximum: 90
          },
          lon: {
            bsonType: "double",
            minimum: -180,
            maximum: 180
          }
        }
      }
    }
  }
}).limit(1)

Exemplo 2: Validação de vendas com itens de matriz

Esta consulta recupera todos os documentos da loja em que o campo sales é um objeto válido que contém um valor total de vendas não negativo e uma matriz salesByCategory com pelo menos um item.

db.stores.find({
  $jsonSchema: {
    bsonType: "object",
    properties: {
      sales: {
        bsonType: "object",
        properties: {
          totalSales: {
            bsonType: "int",
            minimum: 0
          },
          salesByCategory: {
            bsonType: "array",
            minItems: 1,
            items: {
              bsonType: "object",
              properties: {
                categoryName: {
                  bsonType: "string",
                  minLength: 1
                },
                totalSales: {
                  bsonType: "int",
                  minimum: 0
                }
              }
            }
          }
        }
      }
    }
  }
}).limit(1)

Esta consulta deve retornar esta saída:

[
  {
    _id: 'new-store-001',
    name: 'Adatum Corporation - Downtown Branch',
    sales: { totalSales: 5000 },
    createdDate: ISODate('2025-06-11T11:11:32.262Z'),
    status: 'new',
    staff: { totalStaff: { fullTime: 0, partTime: 0 } },
    version: 1,
    storeOpeningDate: ISODate('2025-06-11T11:11:32.262Z'),
    storeFeatures: 213
  }
]

Exemplo 3: Combinando com operadores de consulta

Esta consulta recupera todos os documentos da loja em que o campo staff é um objeto válido que inclui um subobjeto totalStaff com pelo menos um membro da equipe em tempo integral (fullTime ≥ 1) e sales.totalSales maior que 10.000.

db.stores.find({
  $and: [
    {
      $jsonSchema: {
        properties: {
          staff: {
            bsonType: "object",
            properties: {
              totalStaff: {
                bsonType: "object",
                properties: {
                  fullTime: {
                    bsonType: "int",
                    minimum: 1
                  }
                }
              }
            }
          }
        }
      }
    },
    // Additional query constraints
    {
      "sales.totalSales": { $gt: 10000 }
    }
  ]
}).limit(1)

Essa consulta retorna o seguinte resultado:

[
  {
    _id: 'future-electronics-001',
    address: { city: 'New Tech City' },
    name: 'Boulder Innovations - Future Electronics Hub',
    sales: { totalSales: 25000 },
    establishedDate: ISODate('2025-06-11T11:14:23.147Z'),
    categories: [ 'electronics', 'gadgets', 'smart-home' ],
    promotionEvents: [],
    ratings: { average: 0, count: 0, reviews: [] },
    inventory: {
      lastUpdated: ISODate('2025-06-11T11:14:23.147Z'),
      totalItems: 0,
      lowStockAlerts: []
    },
    storeOpeningDate: ISODate('2025-06-11T11:11:32.262Z'),
    storeFeatures: 120
  }
]