Modelo de Configuração de Schema para Dados em MongoDB

Estrutura Básica do Schema


{
  "bsonType": "object",
  "description": "Descrição da coleção",
  "required": ["campo_obrigatorio1", "campo_obrigatorio2"],
  "permission": {
    "read": "condicao_expressao",
    "create": true,
    "update": false,
    "delete": false,
    "count": true
  },
  "properties": {
    "_id": {
      "description": "Identificador único gerado automaticamente"
    },
    "campo_personalizado": {
      "bsonType": "string",
      "title": "Título do Campo",
      "description": "Detalhes adicionais sobre o campo",
      "defaultValue": "valor_padrao",
      "forceDefaultValue": {
        "$env": "variavel_ambiente"
      },
      "required": true,
      "enum": ["opcao1", "opcao2"],
      "enumType": "lista",
      "fileMediaType": "image",
      "fileExtName": "jpg,png",
      "maximum": 100,
      "exclusiveMaximum": true,
      "minimum": 0,
      "exclusiveMinimum": false,
      "minLength": 1,
      "maxLength": 50,
      "trim": "both",
      "format": "email",
      "pattern": "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$",
      "validateFunction": "nome_funcao_validacao",
      "permission": {
        "write": true,
        "read": true
      },
      "errorMessage": "Mensagem de erro personalizada",
      "foreignKey": "outra_colecao.campo_referencia",
      "parentKey": "campo_pai",
      "label": "Rótulo para Interface",
      "group": "grupo_formulario",
      "order": 1,
      "componentForEdit": {
        "name": "componente_entrada",
        "props": {
          "propriedade": "valor"
        }
      },
      "componentForShow": {
        "name": "componente_exibicao"
      }
    }
  },
  "fieldRules": [
    {
      "rule": "data_fim == null || data_fim != null && data_inicio < data_fim",
      "errorMessage": "Datas inconsistentes",
      "client": false
    }
  ]
}

Regras e Comportamentos por Tipo de Dados

Quando o bsonType é definido como file, o sistema ativa automaticamente o upload de arquivos. Se fileMediaType for image, o componente gerado será otimizado para imagens.

Para campos booleanos (bsonType: "bool"), a interface utiliza um controle deslizante (switch) por padrão.

Campos numéricos (bsonType: "int") exibem uma caixa de texto com restrição de entrada numérica. É possível sobrescrever o componente, como no exemplo abaixo com um controle deslizante:


"ordem": {
  "bsonType": "int",
  "title": "Ordenação",
  "defaultValue": 1,
  "componentForEdit": {
    "name": "slider",
    "props": {
      "min": 1,
      "max": 100,
      "step": 1,
      "value": 1,
      "show-value": true
    }
  }
}

Configurações Avançadas e Exemplos Práticos

Ao usar enum com dados de outra tabela, é obrigatório incluir a foreignKey para evitar conflitos de nomes.


"tipo": {
  "bsonType": "string",
  "enum": {
    "collection": "tabela_tipos",
    "field": "nome as value, nome as text",
    "orderby": "ordenacao"
  },
  "foreignKey": "tabela_tipos.nome"
}

Exemplos de Configuração Comum

Permissões baseadas em usuário autenticado:


"permission": {
  "read": "doc.usuario_id == auth.uid",
  "create": "auth.uid != null",
  "update": false,
  "delete": false
}

Captura automática do ID do usuário logado:


"usuario_id": {
  "bsonType": "string",
  "foreignKey": "usuarios._id",
  "forceDefaultValue": {
    "$env": "uid"
  }
}

Registro automático de timestamp:


"data_criacao": {
  "bsonType": "timestamp",
  "forceDefaultValue": {
    "$env": "now"
  }
}

Captura de endereço IP do cliente:


"ip_cliente": {
  "bsonType": "string",
  "forceDefaultValue": {
    "$env": "clientIP"
  }
}

Validação de número de telefone:


"telefone": {
  "bsonType": "string",
  "pattern": "^\\+?[0-9-]{3,20}$"
}

Validação de URL com formato específico:


"icone_url": {
  "bsonType": "string",
  "format": "url",
  "pattern": "^(http://|https://|/|./|@/)\\S"
}

Definição de valores permitidos com enumeração:


"status": {
  "bsonType": "string",
  "enum": ["ativo", "inativo", "pendente"]
}

Tags: mongodb uniCloud BSON JSON Schema Schema Validation

Publicado em 7-7 22:23