Lidar com Erros do MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá técnicas essenciais para lidar com erros comuns no MongoDB. Usando o MongoDB Shell (mongosh), você praticará a identificação e resolução de vários problemas, incluindo falhas de conexão, erros de chave duplicada e erros de validação de dados. Ao final deste laboratório, você terá uma compreensão prática de como tornar suas operações de banco de dados mais confiáveis e robustas.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 100%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Conectando ao MongoDB e Tratando Erros

Erros de conexão são um problema comum ao trabalhar com qualquer banco de dados. Eles podem ocorrer por vários motivos, como um endereço de servidor incorreto, problemas de rede ou o servidor de banco de dados não estar em execução. Nesta etapa, você aprenderá como identificar um erro de conexão e, em seguida, conectar-se com sucesso.

Primeiro, tente se conectar a uma instância do MongoDB em uma porta onde ela não esteja em execução. A porta padrão para o MongoDB é 27017. Tentaremos nos conectar à porta 27018.

Execute o seguinte comando no seu terminal:

mongosh "mongodb://localhost:27018"

Este comando falha e retorna um erro porque o shell não consegue encontrar um servidor MongoDB no endereço especificado. A saída será semelhante a esta:

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27018

O MongoNetworkError indica claramente uma falha na conexão. A parte ECONNREFUSED informa que a máquina de destino recusou ativamente a conexão, o que geralmente significa que nenhum serviço está escutando nessa porta.

Agora, vamos nos conectar à porta correta. O serviço MongoDB foi iniciado para você durante a fase de configuração. Para se conectar a ele, execute o comando mongosh sem nenhum argumento. Isso usará a string de conexão padrão mongodb://127.0.0.1:27017.

mongosh

Após a conexão bem-sucedida, você verá uma mensagem de boas-vindas e o prompt test>, indicando que você está conectado ao banco de dados padrão test.

Current Mongosh Log ID: ...
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.6
Using MongoDB:          8.0.0
Using Mongosh:          2.2.6
...
test>

Agora você está conectado ao servidor MongoDB. Por favor, mantenha este terminal aberto e permaneça no shell mongosh para as próximas etapas.

Lidar com Erros de Chave Duplicada

Manter a integridade dos dados é crucial para qualquer aplicação. Um dos problemas mais comuns de integridade de dados são os registros duplicados. O MongoDB impede isso através de índices únicos, que garantem que um campo indexado não armazene valores duplicados.

Você já deve estar no shell mongosh da etapa anterior. Primeiro, mude para um novo banco de dados chamado errorlab. Um banco de dados é criado automaticamente quando você armazena dados nele pela primeira vez.

use errorlab

Em seguida, crie um índice único no campo email em uma nova coleção users. Este comando informa ao MongoDB que cada documento na coleção users deve ter um valor único para o campo email.

db.users.createIndex({ email: 1 }, { unique: true });

A saída confirma que o índice foi criado com sucesso.

{
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "createdCollectionAutomatically": true,
  "ok": 1
}

Agora, insira um documento na coleção users. Esta operação terá sucesso porque a coleção está vazia e o email é único.

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

Você verá uma mensagem de confirmação com o ID do documento inserido:

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

Em seguida, tente inserir outro documento com o mesmo endereço de email.

db.users.insertOne({ name: "Jane Doe", email: "john@example.com" });

Desta vez, a operação falha. O MongoDB retorna um MongoBulkWriteError com um código de erro específico, E11000, que significa um erro de chave duplicada. Este é o comportamento esperado para proteger a integridade dos dados.

MongoServerError: E11000 duplicate key error collection: errorlab.users index: email_1 dup key: { email: "john@example.com" }

Resolver Chaves Duplicadas com Upsert

Prevenir duplicatas é bom, mas às vezes você quer atualizar um registro se ele existir ou criá-lo se não existir. Essa lógica de "atualizar ou inserir" é um requisito comum. O MongoDB oferece uma maneira limpa de fazer isso usando a opção upsert.

Vamos tentar atualizar o usuário com o email john@example.com. Usaremos o método updateOne com a opção upsert definida como true.

db.users.updateOne(
  { email: "john@example.com" },
  { $set: { name: "John Doe Updated", lastUpdated: new Date() } },
  { upsert: true }
);

A saída mostra que um documento foi correspondido e modificado. O upsertedId é null porque um documento existente foi atualizado, não um novo inserido.

{
  "acknowledged": true,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedId": null
}

Agora, vamos executar um comando semelhante para um usuário que ainda não existe, jane@example.com.

db.users.updateOne(
  { email: "jane@example.com" },
  { $set: { name: "Jane Doe", lastUpdated: new Date() } },
  { upsert: true }
);

Desta vez, a saída mostra que matchedCount é 0, mas um novo documento foi criado, como indicado pelo upsertedId.

{
  "acknowledged": true,
  "matchedCount": 0,
  "modifiedCount": 0,
  "upsertedId": ObjectId("...")
}

Para verificar os resultados, você pode consultar a coleção para ver todos os documentos. O método pretty() formata a saída para facilitar a leitura.

db.users.find().pretty();

A saída exibirá ambos os documentos: o documento de John com o nome atualizado e o documento recém-criado de Jane. A opção upsert fornece uma maneira poderosa e atômica de lidar com cenários de "criar ou atualizar".

Lidar com Erros de Consulta e Validação

Erros também podem ocorrer quando você consulta dados ou quando os dados inseridos não estão em conformidade com regras predefinidas. Nesta etapa, você explorará um erro de sintaxe de consulta e um erro de validação de dados.

Primeiro, vamos ver o que acontece quando você usa um operador de consulta que não existe. Este é um erro de digitação comum.

db.users.find({ name: { $invalidOperator: "John" } });

O MongoDB retorna imediatamente um erro porque não reconhece $invalidOperator.

MongoServerError[BadValue]: unknown operator: $invalidOperator

Em seguida, vamos explorar um recurso mais poderoso: a validação de esquema (schema validation). Você pode definir regras que os documentos devem seguir para serem inseridos ou atualizados em uma coleção. Vamos criar uma nova coleção products com um validador que exige um name (string) e um price (number).

db.createCollection("products", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "price"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        price: {
          bsonType: "number",
          description: "must be a number and is required"
        }
      }
    }
  }
});

Agora, tente inserir um documento que viola este esquema, fornecendo o price como uma string em vez de um número.

db.products.insertOne({ name: "Laptop", price: "1200" });

A operação falha com um MongoBulkWriteError. A mensagem Document failed validation declara claramente o motivo, impedindo que dados incorretos entrem em seu banco de dados.

MongoServerError: Document failed validation
...

Finalmente, insira um documento válido que esteja em conformidade com o esquema.

db.products.insertOne({ name: "Laptop", price: 1200 });

Esta operação é bem-sucedida porque o documento é válido.

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

A validação de esquema é uma ferramenta poderosa para impor a consistência dos dados diretamente no banco de dados.

Resumo

Neste laboratório, você aprendeu a lidar com vários tipos comuns de erros do MongoDB usando o shell mongosh. Você começou identificando e resolvendo um erro de conexão. Em seguida, você impôs a integridade dos dados criando um índice único para prevenir erros de chave duplicada. Você também aprendeu a usar a opção upsert para lidar graciosamente com a lógica de "atualizar ou inserir". Finalmente, você explorou erros de sintaxe de consulta e usou a validação de esquema para impedir que dados inválidos fossem salvos em seu banco de dados. Essas habilidades fundamentais de tratamento de erros são essenciais para construir aplicações confiáveis e robustas com o MongoDB.