Inserir Dados no MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá as técnicas fundamentais para inserir dados em um banco de dados MongoDB. Você praticará a inserção de documentos únicos e múltiplos, o tratamento de erros potenciais e a verificação da integridade dos dados usando o shell do MongoDB (mongosh).

Este laboratório foca na operação "Create" (Criar) dentro do CRUD (Create, Read, Update, Delete). Você construirá um banco de dados simples de livraria do zero, ganhando experiência prática com tarefas essenciais de gerenciamento de dados em um ambiente NoSQL. Ao final, você terá uma compreensão sólida de como adicionar e gerenciar dados de forma eficaz no MongoDB.

Inserir um Documento Único

Nesta primeira etapa, você se conectará ao servidor MongoDB, criará um banco de dados e uma coleção, e inserirá seu primeiro documento. O MongoDB armazena dados em documentos flexíveis, semelhantes a JSON, o que facilita a representação de estruturas de dados complexas.

Primeiro, conecte-se à sua instância local do MongoDB usando o MongoDB Shell. Abra seu terminal e execute o seguinte comando:

mongosh

Você verá um prompt > , indicando que você está agora no MongoDB Shell e conectado ao banco de dados.

Em seguida, mude para um novo banco de dados chamado bookstore. Se o banco de dados não existir, o MongoDB o criará para você quando você armazenar dados pela primeira vez.

use bookstore

A saída confirmará que você mudou para o banco de dados bookstore.

switched to db bookstore

Agora, insira um único documento em uma nova coleção chamada books. Uma coleção é um grupo de documentos MongoDB, aproximadamente equivalente a uma tabela em um banco de dados relacional. O método insertOne() adiciona um único documento à coleção.

db.books.insertOne({
  title: "The Great Gatsby",
  author: "F. Scott Fitzgerald",
  year: 1925,
  genres: ["Classic", "Fiction"],
  stock: 10
});

Após a inserção bem-sucedida, o MongoDB retorna um documento confirmando a operação e fornecendo o _id exclusivo do documento recém-inserido.

{
  acknowledged: true,
  insertedId: ObjectId("652f8d3e111a2b3c4d5e6f78")
}

O _id é um identificador exclusivo gerado automaticamente pelo MongoDB para cada documento, garantindo que cada documento em uma coleção possa ser identificado de forma única.

Inserir Múltiplos Documentos

Inserir documentos um por um pode ser ineficiente. Para adicionar vários documentos de uma vez, o MongoDB fornece o método insertMany(). Isso é conhecido como uma operação de inserção em massa (bulk insert), que reduz o número de idas e vindas de rede para o banco de dados.

Nesta etapa, você adicionará mais três livros à sua coleção books em um único comando. Certifique-se de que você ainda está no shell mongosh e mudou para o banco de dados bookstore.

Use o método insertMany(), passando um array de objetos de documento.

db.books.insertMany([
  {
    title: "1984",
    author: "George Orwell",
    year: 1949,
    genres: ["Dystopian", "Science Fiction"],
    stock: 15
  },
  {
    title: "To Kill a Mockingbird",
    author: "Harper Lee",
    year: 1960,
    genres: ["Classic", "Fiction"],
    stock: 5
  },
  {
    title: "Pride and Prejudice",
    author: "Jane Austen",
    year: 1813,
    genres: ["Romance", "Classic"],
    stock: 12
  }
]);

A saída confirmará que a operação foi reconhecida e listará os valores de _id para cada um dos três documentos que você inseriu.

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("652f8e3e111a2b3c4d5e6f79"),
    '1': ObjectId("652f8e3e111a2b3c4d5e6f7a"),
    '2': ObjectId("652f8e3e111a2b3c4d5e6f7b")
  }
}

Para verificar se os documentos foram adicionados, você pode contar o número total de documentos na coleção.

db.books.countDocuments();

O resultado deve ser 4, representando o documento do passo anterior e os três que você acabou de adicionar.

4

Consultar e Verificar Dados Inseridos

Após inserir dados, o próximo passo lógico é recuperá-los e examiná-los. Isso é crucial para verificar se seus dados foram armazenados corretamente e para construir aplicações que leem do banco de dados. O MongoDB fornece o poderoso método find() para este propósito.

Para recuperar todos os documentos na coleção books, use o método find() sem nenhum argumento.

db.books.find();

Este comando listará todos os quatro documentos atualmente em sua coleção. A saída pode ser extensa, mas é uma boa maneira de ver tudo de uma vez.

Mais frequentemente, você desejará encontrar documentos que correspondam a critérios específicos. Para encontrar todos os livros publicados antes de 1950, você pode usar um filtro de consulta com o operador $lt (menor que).

db.books.find({ year: { $lt: 1950 } });

Esta consulta retornará os documentos de "The Great Gatsby", "1984" e "Pride and Prejudice".

Às vezes, você só precisa de campos específicos dos documentos, não do documento inteiro. Isso é chamado de projeção. Para recuperar apenas o title e o author de todos os livros no gênero "Classic", você pode adicionar um documento de projeção como segundo argumento para find().

db.books.find({ genres: "Classic" }, { title: 1, author: 1, _id: 0 });

No documento de projeção, 1 significa "incluir este campo" e 0 significa "excluir este campo". Por padrão, o campo _id é sempre incluído, então o excluímos explicitamente com _id: 0.

A saída será uma lista limpa de títulos e autores:

[
  { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald" },
  { "title": "To Kill a Mockingbird", "author": "Harper Lee" },
  { "title": "Pride and Prejudice", "author": "Jane Austen" }
]

Lidar com Erros de Inserção com um Índice Único

A integridade dos dados é vital para qualquer banco de dados. Uma maneira de aplicá-la é impedindo entradas duplicadas. Nesta etapa, você aprenderá como criar um índice único e observar como o MongoDB lida com tentativas de violar essa restrição.

Vamos garantir que nenhum livro em nossa coleção possa ter o mesmo título. Para fazer isso, crie um índice único no campo title.

db.books.createIndex({ title: 1 }, { unique: true });

A saída confirma o nome do índice que foi criado.

title_1

Agora que o índice único está implementado, vamos tentar inserir um documento com um título que já existe na coleção, como "1984".

db.books.insertOne({
  title: "1984",
  author: "George Orwell",
  year: 1949,
  genres: ["Dystopian", "Science Fiction"],
  stock: 20
});

Esta operação falhará. O MongoDB lançará uma MongoBulkWriteException com o código de erro E11000, que indica uma violação de chave duplicada. Este é o comportamento esperado e confirma que nosso índice único está funcionando corretamente.

MongoBulkWriteException: E11000 duplicate key error collection: bookstore.books index: title_1 dup key: { title: "1984" }

Em uma aplicação, você encapsularia tais operações de banco de dados em um bloco try...catch para lidar com esses erros de forma graciosa, em vez de travar o programa. Você pode simular isso no shell mongosh também.

try {
  db.books.insertOne({
    title: "1984",
    author: "George Orwell"
  });
} catch (e) {
  print("Error inserting document:", e.message);
}

Este comando capturará a exceção e imprimirá uma mensagem de erro amigável, demonstrando uma maneira robusta de lidar com possíveis falhas de inserção.

Garantir a Integridade dos Dados com Validação de Esquema

Embora o MongoDB seja conhecido por seu esquema flexível, você pode aplicar uma estrutura específica para seus documentos usando validação de esquema. Isso garante que todos os documentos em uma coleção sigam um conjunto definido de regras, melhorando a qualidade e a consistência dos dados.

Nesta etapa final, você adicionará um validador à coleção books. Este validador exigirá que cada documento tenha um title, author e year, e aplicará tipos de dados e intervalos específicos para esses campos.

Use o comando collMod (modificar coleção) para adicionar o validador.

db.runCommand({
  collMod: "books",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["title", "author", "year"],
      properties: {
        title: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        author: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        year: {
          bsonType: "int",
          minimum: 1000,
          maximum: 2024,
          description: "must be an integer between 1000 and 2024"
        }
      }
    }
  }
});

A saída { ok: 1 } confirma que o validador foi aplicado com sucesso.

Agora, vamos testar o validador tentando inserir um documento que viola as regras. Este documento tem um year fora do intervalo permitido.

db.books.insertOne({
  title: "The Hobbit",
  author: "J.R.R. Tolkien",
  year: 999
});

A inserção falhará, e o MongoDB retornará uma mensagem de erro explicando que o documento falhou na validação.

MongoBulkWriteException: Document failed validation

Isso confirma que sua regra de validação de esquema está ativa e protegendo efetivamente a integridade de seus dados. Este recurso poderoso combina a flexibilidade de um banco de dados NoSQL com a confiabilidade da validação de dados.

Resumo

Neste laboratório, você aprendeu com sucesso as técnicas principais para inserir dados em uma coleção MongoDB. Você começou inserindo um único documento com insertOne() e, em seguida, adicionou eficientemente vários documentos usando a operação em massa insertMany().

Você também praticou como consultar e verificar seus dados usando find() e countDocuments(). Mais importante, você explorou dois métodos chave para garantir a integridade dos dados: a criação de um índice único para prevenir duplicatas e a implementação de validação de esquema para impor uma estrutura de documento consistente. Essas habilidades são fundamentais para construir aplicações robustas e confiáveis com MongoDB.