Validar Dados no MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá os fundamentos da validação de dados no MongoDB. A validação de dados é um recurso crucial que ajuda a manter a integridade e a consistência dos seus dados, garantindo que todos os documentos em uma coleção sigam uma estrutura e regras específicas. Você aprenderá a criar coleções com regras de validação, testar essas regras tentando inserir dados válidos e inválidos, e modificar regras de validação em uma coleção existente. Ao final deste laboratório, você será capaz de impor a qualidade dos dados diretamente em seu banco de dados MongoDB.

Criar uma Coleção com Validação de Esquema

Nesta primeira etapa, você se conectará ao servidor MongoDB e criará uma nova coleção com regras de validação específicas. Essas regras definirão os tipos de dados esperados e as restrições para os campos em seus documentos.

Primeiro, abra o MongoDB Shell (mongosh) para interagir com seu banco de dados. Este shell interativo é sua principal ferramenta para gerenciar o MongoDB.

mongosh

Uma vez dentro do shell, você verá um prompt como test>. Isso indica que você está conectado ao banco de dados padrão test. Vamos criar e alternar para um novo banco de dados chamado dataValidationLab.

use dataValidationLab

Agora, vamos criar uma coleção users. Ao criar a coleção, incluiremos um documento validator que usa $jsonSchema para definir nossas regras.

db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "age", "email"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer >= 18 and is required"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "must be a valid email address and is required"
        }
      }
    }
  }
});

Após executar o comando, você deverá ver uma saída indicando sucesso:

{ "ok": 1 }

Vamos detalhar o validador:

  • bsonType: "object": A raiz do documento deve ser um objeto.
  • required: ["name", "age", "email"]: Os campos name, age e email devem estar presentes em todos os documentos.
  • properties: Este objeto define as regras para campos individuais.
    • name: Deve ser uma string.
    • age: Deve ser um int (inteiro) com um valor minimum de 18.
    • email: Deve ser uma string que corresponda à expressão regular pattern, que verifica um formato básico de e-mail.

Você agora criou com sucesso uma coleção com regras de validação de dados. Na próxima etapa, você testará essas regras.

Testar a Validação Inserindo Documentos

Agora que sua coleção users possui regras de validação, vamos testá-las. Você tentará inserir vários documentos: alguns que violam as regras e um que as cumpre. Isso o ajudará a entender como o MongoDB impõe o esquema.

Primeiro, vamos tentar inserir um documento com um tipo de dado incorreto para o campo age. Forneceremos uma string "25" em vez de um inteiro.

db.users.insertOne({
  name: "John Doe",
  age: "25",
  email: "john.doe@example.com"
});

Esta operação falhará. O MongoDB rejeitará o documento e retornará um WriteError porque o campo age não atende ao requisito bsonType: "int". A mensagem de erro conterá detalhes sobre a falha na validação.

MongoServerError: Document failed validation

Em seguida, vamos tentar inserir um documento que está faltando um campo obrigatório, email.

db.users.insertOne({
  name: "Jane Doe",
  age: 30
});

Isso também falhará porque o campo email está listado no array required em nosso validador. Você receberá um WriteCommandError semelhante.

Finalmente, vamos inserir um documento que segue todas as regras. O name e o email são strings, e o age é um inteiro maior ou igual a 18.

db.users.insertOne({
  name: "Alice",
  age: 28,
  email: "alice@example.com"
});

Desta vez, o comando será bem-sucedido, e você verá uma mensagem de confirmação com o _id do documento recém-inserido.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

Para confirmar que o documento válido foi adicionado, você pode consultar a coleção.

db.users.find();

A saída mostrará o único documento que passou com sucesso na validação.

[
  {
    "_id": ObjectId("..."),
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com"
  }
]

Modificar um Validador Existente

Os requisitos da sua aplicação podem mudar ao longo do tempo, e você pode precisar atualizar suas regras de validação. Nesta etapa, você aprenderá como modificar o validador de uma coleção existente usando o comando collMod e, em seguida, testar as novas regras.

Vamos supor que queremos adicionar um novo campo status à nossa coleção users. Este campo deve ser uma string e só pode ter um de dois valores: "active" ou "inactive".

Usamos o comando collMod (collection modify) para aplicar o novo validador.

db.runCommand({
  collMod: "users",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "age", "email", "status"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer >= 18 and is required"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "must be a valid email address and is required"
        },
        status: {
          enum: ["active", "inactive"],
          description: "can only be one of the enum values and is required"
        }
      }
    }
  }
});

O comando retornará { "ok": 1 } em caso de sucesso. Atualizamos agora o validador para exigir o campo status e restringir seu valor usando a palavra-chave enum.

Agora, vamos testar a nova regra. Tente inserir um documento com um status inválido.

db.users.insertOne({
  name: "Bob",
  age: 45,
  email: "bob@example.com",
  status: "pending"
});

Isso falhará porque "pending" não está na lista enum para o campo status. Em seguida, insira um documento que esteja em conformidade com as regras atualizadas.

db.users.insertOne({
  name: "Bob",
  age: 45,
  email: "bob@example.com",
  status: "active"
});

Esta inserção será bem-sucedida. Para ver todos os documentos em sua coleção, execute find() novamente.

db.users.find();

Agora você verá os documentos de Alice e Bob. Observe que o documento de Alice, inserido antes da alteração da regra, não possui o campo status. Por padrão, a validação não se aplica a documentos existentes até que eles sejam modificados.

Resumo

Neste laboratório, você aprendeu as técnicas essenciais para implementar a validação de dados no MongoDB. Você começou criando uma coleção com um validador $jsonSchema para impor tipos de dados, campos obrigatórios e restrições de valor. Em seguida, testou essas regras tentando inserir documentos inválidos e válidos, observando como o MongoDB rejeita dados que não estão em conformidade com o esquema. Finalmente, você aprendeu como modificar as regras de validação para uma coleção existente usando o comando collMod para se adaptar a novos requisitos. Essas habilidades são fundamentais para construir aplicações robustas e manter alta qualidade de dados em seus bancos de dados MongoDB.