Ordenar e Limitar Resultados do MongoDB

MongoDBBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá técnicas fundamentais de consulta MongoDB para classificar, limitar e filtrar resultados de banco de dados. Essas habilidades são essenciais para gerenciar e recuperar dados de forma eficiente. Você trabalhará com o shell MongoDB (mongosh) para realizar essas operações em uma coleção de documentos de amostra.

O laboratório irá guiá-lo através da classificação de documentos por campos únicos ou múltiplos, controlando o número de resultados retornados usando limites e offsets, e contando documentos que correspondem a critérios específicos. Ao final deste laboratório, você terá uma compreensão sólida de como organizar e recuperar dados de um banco de dados MongoDB.

Ordenar Documentos por um Único Campo

Nesta etapa, você aprenderá como classificar documentos em uma coleção MongoDB. A classificação permite organizar os resultados da consulta em uma ordem específica, o que é crucial para análise e apresentação de dados. Seu ambiente foi pré-configurado com um banco de dados bookstore contendo uma coleção books.

Primeiro, abra o shell MongoDB para interagir com o banco de dados. No seu terminal, execute o seguinte comando:

mongosh

Uma vez dentro do shell, mude para o banco de dados bookstore.

use bookstore

Para ver os documentos na coleção books, você pode usar o método find().

db.books.find();

Agora, vamos classificar esses documentos. Para classificar por um único campo, você encadeia o método .sort() a uma consulta find(). O método sort() recebe um objeto especificando o campo pelo qual classificar e a direção: 1 para ascendente e -1 para descendente.

Vamos classificar os livros pelo número de páginas em ordem ascendente (do menor para o maior número de páginas).

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

Você verá o livro com o menor número de páginas, "Python Basics", listado primeiro.

[
  {
    _id: ObjectId('...'),
    title: 'Python Basics',
    pages: 250,
    price: 29.99
  },
  {
    _id: ObjectId('...'),
    title: 'MongoDB Fundamentals',
    pages: 300,
    price: 34.99
  },
  ...
]

Em seguida, vamos classificar os livros por preço em ordem descendente para encontrar os mais caros primeiro.

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

Este comando exibirá "Data Science" no topo, pois ele tem o preço mais alto.

[
  {
    _id: ObjectId('...'),
    title: 'Data Science',
    pages: 350,
    price: 44.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  ...
]

Ordenar por Múltiplos Campos

Às vezes, classificar por um único campo não é suficiente. O MongoDB permite que você especifique várias chaves para classificação para criar ordenações mais refinadas. Nesta etapa, você aprenderá como classificar documentos com base em uma sequência de campos.

Vamos adicionar mais alguns livros à nossa coleção para ilustrar melhor a classificação por múltiplas chaves. Esses novos livros compartilham o mesmo preço de um existente, mas têm contagens de páginas diferentes.

db.books.insertMany([
  { title: "Machine Learning", pages: 420, price: 39.99 },
  { title: "Web Development", pages: 380, price: 39.99 }
]);

Agora, temos três livros com preço de $39.99. Se classificarmos apenas por preço, a ordem desses três livros não é garantida. Para criar uma ordem previsível, podemos adicionar uma segunda chave de classificação.

Vamos classificar os livros primeiro por price em ordem ascendente e, em seguida, por pages em ordem descendente para livros com o mesmo preço.

db.books.find().sort({ price: 1, pages: -1 });

O processador de consulta primeiro classifica todos os documentos por price. Em seguida, para documentos que têm o mesmo price (como nossos três livros a $39.99), ele os classifica por pages em ordem descendente.

Sua saída para os livros de $39.99 deve aparecer nesta ordem:

  1. "Machine Learning" (420 páginas)
  2. "JavaScript Advanced" (400 páginas)
  3. "Web Development" (380 páginas)
[
  ...,
  {
    _id: ObjectId('...'),
    title: 'Machine Learning',
    pages: 420,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  },
  ...
]

Esta técnica é útil para criar classificações complexas e estáveis para interfaces de usuário e relatórios.

Limitar e Pular Resultados

Ao trabalhar com grandes conjuntos de dados, você geralmente precisa recuperar apenas um subconjunto dos resultados. O MongoDB fornece os métodos .limit() e .skip() para esse fim. Juntos, eles são a base para implementar paginação.

O método .limit() restringe o número de documentos retornados por uma consulta. Vamos recuperar apenas os 3 livros mais caros.

db.books.find().sort({ price: -1 }).limit(3);

Este comando primeiro classifica todos os livros por preço em ordem descendente e, em seguida, retorna apenas os três primeiros documentos da lista classificada.

O método .skip() instrui o cursor a ignorar um número especificado de documentos no início do conjunto de resultados. Isso é útil para navegar por páginas de dados.

Por exemplo, para obter a segunda página de resultados onde cada página tem 2 livros, você pularia os primeiros 2 livros e limitaria o resultado a 2. Vamos aplicar isso à nossa lista classificada por preço para obter o 3º e o 4º livros mais caros.

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

Esta consulta executa as seguintes ações em ordem:

  1. sort({ price: -1 }): Classifica todos os livros do mais caro para o menos caro.
  2. skip(2): Pula os 2 livros mais caros.
  3. limit(2): Retorna os próximos 2 livros da lista.

A saída mostrará o terceiro e o quarto livros na lista classificada.

[
  {
    _id: ObjectId('...'),
    title: 'JavaScript Advanced',
    pages: 400,
    price: 39.99
  },
  {
    _id: ObjectId('...'),
    title: 'Web Development',
    pages: 380,
    price: 39.99
  }
]

Ao ajustar os valores em skip() e limit(), você pode implementar um sistema de paginação completo.

Contar Documentos

Outro requisito comum é contar o número de documentos em uma coleção, seja no total ou correspondendo a um filtro específico. O MongoDB fornece o método countDocuments() para isso.

Para obter o número total de livros em nossa coleção, execute o seguinte comando:

db.books.countDocuments();

Isso retornará a contagem total de documentos, que deve ser 6 após as adições da Etapa 2.

Mais poderosamente, countDocuments() pode aceitar um filtro de consulta para contar apenas os documentos que correspondem a certos critérios. Vamos contar quantos livros custam mais de 35. Usamos o operador de consulta `gt` (maior que) para isso.

db.books.countDocuments({ price: { $gt: 35 } });

Isso retornará o número de livros cujo preço é maior que 35.

Você também pode usar múltiplas condições em seu filtro. Vamos contar os livros que têm preço exato de $39.99 e têm 400 ou mais páginas. Usamos o operador $gte (maior ou igual a) aqui.

db.books.countDocuments({ price: 39.99, pages: { $gte: 400 } });

Este comando retornará 2, correspondendo a "Machine Learning" (420 páginas) e "JavaScript Advanced" (400 páginas). Usar countDocuments() com filtros é uma maneira eficiente de obter estatísticas sobre seus dados sem recuperar os próprios documentos.

Para sair do shell do MongoDB, você pode digitar exit ou pressionar Ctrl+D.

exit;

Resumo

Neste laboratório, você aprendeu várias técnicas essenciais de consulta ao MongoDB. Você começou classificando documentos usando um único campo em ordem ascendente e descendente com o método .sort(). Em seguida, avançou para a classificação por múltiplas chaves, que permite uma ordenação de resultados mais complexa e estável.

Em seguida, você explorou como controlar o tamanho do seu conjunto de resultados usando .limit() para restringir o número de documentos retornados e .skip() para implementar paginação. Finalmente, você aprendeu a usar countDocuments() para contar eficientemente documentos, tanto em uma coleção inteira quanto aqueles que correspondem a critérios de filtro específicos. Esses comandos são ferramentas fundamentais para qualquer desenvolvedor que trabalhe com MongoDB.