Ordenar y Limitar Resultados de MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá técnicas fundamentales de consulta en MongoDB para ordenar, limitar y filtrar resultados de bases de datos. Estas habilidades son esenciales para gestionar y recuperar datos de manera eficiente. Trabajará con la shell de MongoDB (mongosh) para realizar estas operaciones en una colección de documentos de ejemplo.

El laboratorio lo guiará a través de la ordenación de documentos por uno o varios campos, el control del número de resultados devueltos utilizando límites y desplazamientos (offsets), y el conteo de documentos que coinciden con criterios específicos. Al final de este laboratorio, tendrá una comprensión sólida de cómo organizar y recuperar datos de una base de datos MongoDB.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 95%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Ordenar Documentos por un Solo Campo

En este paso, aprenderá cómo ordenar documentos en una colección de MongoDB. La ordenación le permite organizar los resultados de las consultas en un orden específico, lo cual es crucial para el análisis y la presentación de datos. Su entorno ha sido preconfigurado con una base de datos bookstore que contiene una colección books.

Primero, abra la shell de MongoDB para interactuar con la base de datos. En su terminal, ejecute el siguiente comando:

mongosh

Una vez dentro de la shell, cambie a la base de datos bookstore.

use bookstore

Para ver los documentos en la colección books, puede usar el método find().

db.books.find();

Ahora, ordenemos estos documentos. Para ordenar por un único campo, encadene el método .sort() a una consulta find(). El método sort() toma un objeto que especifica el campo por el cual ordenar y la dirección: 1 para ascendente y -1 para descendente.

Ordenemos los libros por el número de páginas en orden ascendente (de menos a más páginas).

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

Verá el libro con menos páginas, "Python Basics", listado primero.

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

A continuación, ordenemos los libros por precio en orden descendente para encontrar primero los más caros.

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

Este comando mostrará "Data Science" en la parte superior, ya que tiene el precio más alto.

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

Ordenar por Múltiples Campos

A veces, ordenar por un solo campo no es suficiente. MongoDB le permite especificar múltiples claves para ordenar y crear ordenaciones más refinadas. En este paso, aprenderá cómo ordenar documentos basándose en una secuencia de campos.

Agreguemos algunos libros más a nuestra colección para ilustrar mejor la ordenación por múltiples claves. Estos nuevos libros comparten el mismo precio que uno existente pero tienen diferentes recuentos de páginas.

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

Ahora, tenemos tres libros con un precio de $39.99. Si ordenamos solo por precio, el orden de estos tres libros no está garantizado. Para crear un orden predecible, podemos agregar una segunda clave de ordenación.

Ordenemos los libros primero por price en orden ascendente, y luego por pages en orden descendente para los libros con el mismo precio.

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

El procesador de consultas primero ordena todos los documentos por price. Luego, para los documentos que tienen el mismo price (como nuestros tres libros a $39.99), los ordena por pages en orden descendente.

Su salida para los libros de $39.99 debería aparecer en este orden:

  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 es útil para crear ordenaciones complejas y estables para interfaces de usuario e informes.

Limitar y Omitir Resultados

Al trabajar con grandes conjuntos de datos, a menudo necesita recuperar solo un subconjunto de los resultados. MongoDB proporciona los métodos .limit() y .skip() para este propósito. Juntos, son la base para implementar la paginación.

El método .limit() restringe el número de documentos devueltos por una consulta. Recuperemos solo los 3 libros más caros.

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

Este comando primero ordena todos los libros por precio en orden descendente y luego devuelve solo los primeros tres documentos de la lista ordenada.

El método .skip() indica al cursor que ignore un número especificado de documentos al principio del conjunto de resultados. Esto es útil para navegar por páginas de datos.

Por ejemplo, para obtener la segunda página de resultados donde cada página tiene 2 libros, omitiría los primeros 2 libros y limitaría el resultado a 2. Apliquemos esto a nuestra lista ordenada por precio para obtener el tercer y cuarto libro más caro.

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

Esta consulta realiza las siguientes acciones en orden:

  1. sort({ price: -1 }): Ordena todos los libros de más caros a menos caros.
  2. skip(2): Omite los 2 libros más caros.
  3. limit(2): Devuelve los siguientes 2 libros de la lista.

La salida mostrará el tercer y cuarto libro en la lista ordenada.

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

Ajustando los valores en skip() y limit(), puede implementar un sistema de paginación completo.

Contar Documentos

Otro requisito común es contar el número de documentos en una colección, ya sea en total o que coincidan con un filtro específico. MongoDB proporciona el método countDocuments() para esto.

Para obtener el número total de libros en nuestra colección, ejecute el siguiente comando:

db.books.countDocuments();

Esto devolverá el recuento total de documentos, que debería ser 6 después de las adiciones del Paso 2.

De manera más potente, countDocuments() puede aceptar un filtro de consulta para contar solo los documentos que cumplen ciertos criterios. Contemos cuántos libros cuestan más de 35. Usamos el operador de consulta `gt` (mayor que) para esto.

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

Esto devolverá el número de libros cuyo precio sea mayor que 35.

También puede usar múltiples condiciones en su filtro. Contemos los libros que tienen un precio exacto de $39.99 y tienen 400 o más páginas. Usamos el operador $gte (mayor o igual que) aquí.

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

Este comando devolverá 2, correspondiente a "Machine Learning" (420 páginas) y "JavaScript Advanced" (400 páginas). Usar countDocuments() con filtros es una forma eficiente de obtener estadísticas sobre sus datos sin recuperar los documentos en sí.

Para salir del shell de MongoDB, puede escribir exit o presionar Ctrl+D.

exit;

Resumen

En este laboratorio, ha aprendido varias técnicas esenciales de consulta en MongoDB. Comenzó ordenando documentos usando un solo campo en orden ascendente y descendente con el método .sort(). Luego avanzó a la ordenación por claves múltiples, lo que permite una ordenación de resultados más compleja y estable.

A continuación, exploró cómo controlar el tamaño de su conjunto de resultados usando .limit() para restringir el número de documentos devueltos y .skip() para implementar la paginación. Finalmente, aprendió a usar countDocuments() para contar eficientemente documentos, tanto en una colección completa como aquellos que coinciden con criterios de filtro específicos. Estos comandos son herramientas fundamentales para cualquier desarrollador que trabaje con MongoDB.