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"]
}