Atualizar Registros no MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como atualizar documentos em uma coleção MongoDB. Você começará modificando um único documento usando o método updateOne(). Em seguida, aprenderá a modificar vários documentos de uma vez com o método updateMany(). Você também trabalhará com vários operadores de atualização como $set, $inc e $unset para realizar modificações específicas. Finalmente, você explorará a opção upsert, que permite atualizar um documento existente ou criar um novo se ele não existir. Este laboratório oferece uma abordagem prática e direta para dominar habilidades fundamentais de manipulação de dados no MongoDB.

Atualizando um Documento Único com updateOne

Nesta etapa, você aprenderá como modificar um único documento em uma coleção MongoDB. Usaremos o método updateOne() juntamente com o operador $set para alterar o valor de um campo em um documento específico.

Primeiro, abra o MongoDB Shell para interagir com seu banco de dados.

mongosh

Uma vez dentro do shell, mude para o mylab_database que foi preparado para você.

use mylab_database

Vamos visualizar os documentos atuais na coleção books. O método .pretty() formata a saída para torná-la mais legível.

db.books.find().pretty();

Você deverá ver os três documentos de livros iniciais. Os valores de _id serão únicos em seu ambiente.

[
  {
    _id: ObjectId("..."),
    title: 'JavaScript Fundamentals',
    author: 'Mike Johnson',
    year: 2022,
    pages: 350
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99
  }
]

Agora, vamos atualizar o ano de publicação do livro "JavaScript Fundamentals" para 2023.

db.books.updateOne(
  { title: "JavaScript Fundamentals" },
  { $set: { year: 2023 } }
);

Vamos detalhar este comando:

  • updateOne(): Este método encontra o primeiro documento que corresponde ao filtro e o atualiza.
  • { title: "JavaScript Fundamentals" }: Este é o documento de filtro. Ele diz ao MongoDB para encontrar um documento onde o campo title seja "JavaScript Fundamentals".
  • { $set: { year: 2023 } }: Este é o documento de atualização. O operador $set substitui o valor do campo year por 2023.

O comando retorna um objeto de resultado que confirma a operação.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

O matchedCount: 1 indica que um documento correspondeu ao nosso filtro, e modifiedCount: 1 indica que um documento foi atualizado com sucesso.

Para verificar a alteração, encontre o documento novamente.

db.books.findOne({ title: "JavaScript Fundamentals" });

A saída mostrará o documento atualizado com o novo ano.

{
  _id: ObjectId("..."),
  title: 'JavaScript Fundamentals',
  author: 'Mike Johnson',
  year: 2023,
  pages: 350
}

Atualizando Múltiplos Documentos com updateMany

Às vezes, você precisa atualizar vários documentos de uma vez. Para isso, o MongoDB oferece o método updateMany(). Nesta etapa, você adicionará um novo campo a todos os livros publicados antes de um determinado ano.

Vamos adicionar um campo status com o valor "Classic" a todos os livros publicados antes de 2022.

db.books.updateMany({ year: { $lt: 2022 } }, { $set: { status: "Classic" } });

Aqui está uma explicação do comando:

  • updateMany(): Este método atualiza todos os documentos que correspondem ao filtro especificado.
  • { year: { $lt: 2022 } }: Este filtro seleciona documentos onde o year é menor que 2022. O operador $lt significa "less than" (menor que).
  • { $set: { status: "Classic" } }: Este documento de atualização adiciona um novo campo status com o valor "Classic" a todos os documentos correspondentes.

A saída mostrará quantos documentos foram correspondidos e modificados. No nosso caso, dois livros foram publicados antes de 2022.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 2,
  "modifiedCount": 2,
  "upsertedCount": 0
}

Para verificar que ambos os documentos foram atualizados, você pode consultar todos os livros com o status "Classic".

db.books.find({ status: "Classic" }).pretty();

Você verá os dois livros que agora incluem o campo status.

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450,
    status: 'Classic'
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99,
    status: 'Classic'
  }
]

Usando Mais Operadores de Atualização: $inc e $unset

O MongoDB oferece uma variedade de operadores para diferentes tipos de atualizações. Nesta etapa, você aprenderá a usar $inc para modificar valores numéricos e $unset para remover campos de um documento.

Primeiro, vamos usar o operador $inc para aumentar a contagem de páginas do livro "Python Deep Dive" em 50. O operador $inc incrementa um campo por um valor especificado.

db.books.updateOne({ title: "Python Deep Dive" }, { $inc: { pages: 50 } });

Para confirmar a alteração, recupere o documento.

db.books.findOne({ title: "Python Deep Dive" });

O campo pages agora deve ser 500 (450 + 50).

{
  _id: ObjectId("..."),
  title: 'Python Deep Dive',
  author: 'Sarah Williams',
  year: 2021,
  pages: 500,
  status: 'Classic'
}

Em seguida, vamos remover o campo price do documento "Machine Learning Basics". O operador $unset exclui um campo específico. O valor fornecido para $unset (neste caso, "") não importa e pode ser qualquer valor.

db.books.updateOne(
  { title: "Machine Learning Basics" },
  { $unset: { price: "" } }
);

Vamos verificar se o campo price foi removido.

db.books.findOne({ title: "Machine Learning Basics" });

A saída mostrará o documento sem o campo price.

{
  _id: ObjectId("..."),
  title: 'Machine Learning Basics',
  author: 'John Doe',
  year: 2020,
  status: 'Classic'
}

Criando Documentos com upsert

Um "upsert" é um tipo especial de operação de atualização que atualiza um documento se ele existir ou insere um novo se não existir. Isso é útil para evitar a lógica separada de "verificar e depois inserir" e garante atomicidade nas operações de banco de dados. Upserts são particularmente valiosos em cenários onde você deseja:

  • Garantir a consistência dos dados: Em vez de primeiro verificar se um documento existe e depois decidir se deve inserir ou atualizar, você pode executar uma única operação que lida com ambos os casos atomicamente.
  • Lidar com operações concorrentes: Em ambientes multiusuário, um upsert evita race conditions (condições de corrida) onde outro processo pode inserir o mesmo documento entre suas operações de verificação e inserção.
  • Simplificar a lógica da aplicação: Reduz a necessidade de lógica condicional complexa no código da sua aplicação, tornando-a mais fácil de manter e menos propensa a erros.

Você pode habilitar esse comportamento adicionando a opção upsert: true ao seu comando de atualização.

Vamos tentar adicionar um novo livro, "Cloud Computing Essentials". Como este livro não existe em nossa coleção, a operação upsert irá criá-lo.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

O comando consiste em três partes:

  1. O filtro: { title: "Cloud Computing Essentials" }
  2. A atualização: { $set: { ... } }
  3. As opções: { upsert: true }

Como nenhum documento correspondeu ao filtro, um novo foi criado. O objeto de resultado reflete isso incluindo um upsertedId.

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

Agora, vamos executar o mesmo comando novamente. Desta vez, o MongoDB encontrará o documento que acabamos de criar e o atualizará.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

O resultado agora mostra matchedCount: 1. Como os dados que estamos definindo são os mesmos que os dados existentes, modifiedCount é 0. Se tivéssemos alterado um valor, modifiedCount seria 1.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 0,
  "upsertedCount": 0
}

Você pode verificar se o novo livro existe na coleção.

db.books.findOne({ title: "Cloud Computing Essentials" });

A saída exibirá o documento recém-criado.

{
  _id: ObjectId("..."),
  title: 'Cloud Computing Essentials',
  author: 'David Lee',
  year: 2023,
  pages: 300
}

Quando terminar, você pode sair do MongoDB Shell.

exit;

Resumo

Neste laboratório, você aprendeu as técnicas essenciais para atualizar documentos no MongoDB. Você praticou a modificação de documentos únicos com updateOne e de múltiplos documentos com updateMany. Você também explorou operadores de atualização poderosos, incluindo $set para alterar valores de campos, $inc para incrementar números e $unset para remover campos. Finalmente, você aprendeu a usar a opção upsert para criar um documento se ele ainda não existir. Essas habilidades são fundamentais para gerenciar e manter dados em qualquer aplicação MongoDB.