Escrever Consultas Básicas no MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá técnicas essenciais de consulta MongoDB. Você começará conectando-se a um banco de dados e inserindo dados. Em seguida, praticará a recuperação de documentos, filtrando-os com correspondências exatas e operadores de comparação, selecionando campos específicos para retornar e formatando a saída ordenando e limitando os resultados. Ao final deste laboratório, você terá uma base sólida para consultar dados em um banco de dados MongoDB.

Conectar ao MongoDB e Encontrar Todos os Documentos

Nesta primeira etapa, você se conectará ao servidor MongoDB, criará um banco de dados e uma coleção, inserirá alguns dados de exemplo e, em seguida, recuperará todos os documentos dessa coleção. Este é o ponto de partida para qualquer interação com o banco de dados.

Primeiro, abra seu terminal e inicie o MongoDB Shell executando o comando mongosh.

mongosh

O prompt do seu terminal mudará para indicar que você está agora dentro do MongoDB Shell, pronto para executar comandos do 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á quando você armazenar dados pela primeira vez.

use bookstore

Agora, vamos inserir alguns documentos em uma nova coleção chamada books. Uma coleção é um grupo de documentos MongoDB, semelhante a uma tabela em um banco de dados relacional. O método insertMany() permite adicionar vários documentos de uma vez.

db.books.insertMany([
  { title: "Python Basics", author: "John Smith", year: 2022, stock: 15 },
  { title: "MongoDB Essentials", author: "Jane Doe", year: 2023, stock: 8 },
  { title: "Web Development", author: "Alice Johnson", year: 2021, stock: 20 }
]);

Após executar o comando, você verá uma confirmação de que os documentos foram inseridos com sucesso.

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

db.books.find();

A saída listará todos os três documentos que você acabou de inserir. Cada documento possui um campo _id, que é um identificador único adicionado automaticamente pelo MongoDB.

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  },
  {
    _id: ObjectId("..."),
    title: 'MongoDB Essentials',
    author: 'Jane Doe',
    year: 2023,
    stock: 8
  },
  {
    _id: ObjectId("..."),
    title: 'Web Development',
    author: 'Alice Johnson',
    year: 2021,
    stock: 20
  }
]

Consultar Documentos com Correspondências Exatas

Agora que você pode recuperar todos os documentos, o próximo passo é filtrá-los para encontrar os específicos. Você pode fazer isso fornecendo um documento de filtro de consulta ao método find(). Isso permite que você realize correspondências exatas em valores de campos.

Vamos encontrar o livro com o título exato "Python Basics". O filtro de consulta { title: "Python Basics" } informa ao MongoDB para retornar apenas os documentos onde o campo title é exatamente "Python Basics".

db.books.find({ title: "Python Basics" });

O comando retornará apenas o documento que corresponde aos critérios:

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    author: 'John Smith',
    year: 2022,
    stock: 15
  }
]

Você também pode consultar com base em outros campos, como números. Por exemplo, para encontrar todos os livros publicados no ano de 2021:

db.books.find({ year: 2021 });

Para criar uma consulta mais específica, você pode especificar vários campos no documento de filtro. Isso cria uma condição implícita de "E" (AND), o que significa que todas as condições especificadas devem ser verdadeiras para que um documento seja retornado. Vamos encontrar um livro escrito por "Jane Doe" E publicado em 2023.

db.books.find({ author: "Jane Doe", year: 2023 });

Esta consulta retornará o livro "MongoDB Essentials", pois é o único que corresponde tanto ao autor quanto ao ano.

Filtrar com Operadores de Comparação

Correspondências exatas são úteis, mas muitas vezes você precisa encontrar documentos com base em comparações, como encontrar todos os livros publicados após um determinado ano ou com estoque acima de um certo nível. O MongoDB fornece um conjunto de operadores de consulta para esse propósito.

Operadores de comparação são especificados dentro do documento de consulta usando uma sintaxe como { campo: { $operador: valor } }.

Vamos encontrar todos os livros publicados após 2021. Usaremos o operador "maior que", $gt.

db.books.find({ year: { $gt: 2021 } });

Isso retornará "Python Basics" (2022) e "MongoDB Essentials" (2023).

Aqui estão alguns outros operadores de comparação comuns:

  • $lt: menor que
  • $gte: maior ou igual a
  • $lte: menor ou igual a
  • $ne: diferente de

Por exemplo, para encontrar todos os livros com estoque de 15 ou menos, você pode usar o operador $lte.

db.books.find({ stock: { $lte: 15 } });

Outro operador útil é o $in, que corresponde a qualquer um dos valores especificados em um array. Vamos encontrar todos os livros escritos por "John Smith" ou "Alice Johnson".

db.books.find({ author: { $in: ["John Smith", "Alice Johnson"] } });

Esta consulta retornará "Python Basics" e "Web Development". Você pode combinar operadores com correspondências exatas para construir consultas mais complexas. Por exemplo, encontre livros publicados em ou após 2022 com estoque inferior a 20.

db.books.find({ year: { $gte: 2022 }, stock: { $lt: 20 } });

Selecionar Campos Específicos para Retorno (Projeção)

Por padrão, as consultas do MongoDB retornam todos os campos nos documentos correspondentes. Para melhorar o desempenho e tornar a saída mais limpa, você pode especificar quais campos retornar. Isso é chamado de projeção.

A projeção é tratada pelo segundo argumento no método find(). Este argumento é um documento onde você especifica os campos a serem incluídos com um 1 ou excluídos com um 0.

Vamos recuperar todos os livros, mas retornar apenas seus campos title e author. O primeiro argumento, {}, é um filtro vazio, que corresponde a todos os documentos.

db.books.find({}, { title: 1, author: 1 });

Você notará que o campo _id ainda está incluído na saída. O campo _id é sempre retornado por padrão. Para excluí-lo, você deve explicitamente defini-lo como 0.

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

Agora a saída será muito mais limpa, contendo apenas os campos solicitados:

[
  { "title": "Python Basics", "author": "John Smith" },
  { "title": "MongoDB Essentials", "author": "Jane Doe" },
  { "title": "Web Development", "author": "Alice Johnson" }
]

Você pode combinar um filtro de consulta com uma projeção. Por exemplo, vamos encontrar livros publicados em 2023 e retornar apenas seus títulos.

db.books.find({ year: 2023 }, { title: 1, _id: 0 });

Este recurso poderoso permite que você adapte os resultados da consulta exatamente ao que seu aplicativo precisa, reduzindo a transferência de dados desnecessária.

Ordenar, Pular e Limitar Resultados

Frequentemente, você precisa controlar a ordem e a quantidade dos resultados retornados por uma consulta. O MongoDB fornece métodos de cursor que você pode encadear a uma consulta find() para ordenar, pular e limitar os documentos no conjunto de resultados.

Para ordenar os resultados, use o método .sort(). Ele recebe um documento especificando o campo pelo qual ordenar e a direção: 1 para ascendente e -1 para descendente. Vamos ordenar os livros por ano em ordem descendente (mais novos primeiro).

db.books.find().sort({ year: -1 });

Para limitar o número de documentos retornados, use o método .limit(). Por exemplo, para obter apenas os 2 livros mais novos:

db.books.find().sort({ year: -1 }).limit(2);

O método .skip() é usado para pular um número especificado de documentos do início do conjunto de resultados. Isso é útil para implementar paginação. Vamos recuperar todos os livros, mas pular o primeiro.

db.books.find().sort({ year: 1 }).skip(1);

Você pode encadear esses métodos para criar consultas poderosas e precisas. Por exemplo, para encontrar o segundo livro mais antigo na coleção, você pode ordenar por ano ascendente, pular o primeiro resultado e limitar a saída a um.

db.books.find().sort({ year: 1 }).skip(1).limit(1);

Este comando retornará o livro "Python Basics", que foi publicado em 2022.

Finalmente, para sair do shell do MongoDB, digite exit ou pressione Ctrl+D.

exit;

Resumo

Neste laboratório, você aprendeu os fundamentos da escrita de consultas básicas no MongoDB. Você começou conectando-se a um banco de dados com o shell mongosh e inserindo documentos em uma coleção. Em seguida, praticou a recuperação de documentos usando find(), filtrando resultados com correspondências exatas e operadores de comparação como $gt e $in, e usando projeção para selecionar campos específicos. Finalmente, você aprendeu como formatar a saída encadeando métodos de cursor como .sort(), .limit() e .skip() para controlar a ordem e o tamanho do seu conjunto de resultados. Essas habilidades formam a base para interagir e gerenciar dados no MongoDB.