Contenido del curso
Database
- 4

Configuración y ejecución de MongoDB con Docker Compose
08:51 min - 5

Conexión a Base de Datos MongoDB con Mongo Compass
05:05 min - 6

Instalación y conexión de MongoDB en Node con driver oficial
06:59 min - 7

Inyección de Conexiones MongoDB en Servicios NestJS
06:57 min - 8

Consultas a MongoDB con Nest.js: Implementación de Endpoints
04:46 min - 9

Variables de Entorno para Configuración de MongoDB en Node.js
10:43 min
Mongoose
- 10

Instalación y Configuración de Mongoose con NestJS
07:52 min - 11

Definición de Esquemas en Mongoose para eCommerce con NestJS
07:45 min - 12

Operaciones CRUD con MongoDB y Node.js en un Servicio de Productos
09:29 min - 13

Creación, actualización y eliminación de productos en MongoDB
10:12 min - 14

Validación de MongoID con Pipes en NestJS
06:38 min - 15

Paginación en MongoDB con DTOs y Validaciones en NestJS
11:13 min - 16

Consultas Avanzadas con Rangos de Precios en MongoDB
Viendo ahora - 17

Indexación en MongoDB: Cómo optimizar consultas rápidas
03:11 min
Relaciones en MongoDB
- 18

Relaciones embebidas en MongoDB: Manejo y ejemplos prácticos
07:55 min - 19

Relaciones uno a uno referenciadas en MongoDB
12:20 min - 20

Relaciones Uno a Muchos en MongoDB: Arrays Embebidos vs Referenciados
09:28 min - 21

Tipado de Documentos Embebidos en NestJS con Mongoose
01:49 min - 22

Relaciones Uno a Muchos Referenciadas en MongoDB
14:36 min - 23

Manipulación de Arrays en E-commerce: Métodos y Endpoints
13:08 min
Próximos pasos
Consultas Avanzadas con Rangos de Precios en MongoDB
Resumen
Construir consultas avanzadas en MongoDB es fundamental cuando necesitas ir más allá de un simple find. Aquí se explora cómo implementar filtros por rango de precios en una API con NestJS y Mongoose, aprovechando validaciones condicionales y queries dinámicos que escalan con facilidad.
¿Cómo agregar parámetros de precio mínimo y máximo al DTO?
El punto de partida es el DTO de filters, donde ya existían limit y offset para la paginación. Ahora se incorporan dos nuevos campos: minPrice y maxPrice [0:18]. Ambos son de tipo numérico y representan el rango de precios que el usuario quiere consultar.
Para decorarlos correctamente se aplican estas reglas:
- Se marca cada campo como opcional con
@IsOptional(), de modo que si no se envían, la API devuelve todos los registros. - Se usa
@IsPositive()en lugar de solo@Min(0), garantizando que los valores sean al menos uno [1:05].
¿Qué es validateIf y por qué usarlo?
Una situación interesante aparece cuando el usuario envía minPrice pero omite maxPrice. Sin el límite superior, el rango queda incompleto. Para resolver esto se utiliza el decorador ValidateIf [1:30], que convierte un campo en obligatorio de forma condicional.
En la práctica, maxPrice deja de ser opcional y se vuelve obligatorio si y solo si minPrice existe. La implementación luce así:
typescript @ValidateIf((params) => params.minPrice) @IsPositive() maxPrice: number;
Esto permite crear dependencias entre parámetros de un query sin romper la flexibilidad de la API.
¿Cómo construir filtros dinámicos en el servicio?
Dentro del servicio, además de extraer limit y offset, ahora se desestructuran minPrice y maxPrice desde los parámetros [2:08]. La estrategia consiste en crear un objeto filters que inicia vacío y se va llenando según las condiciones que se cumplan.
Este objeto se tipa con FilterQuery de Mongoose, asociado al modelo de productos [2:30]:
typescript const filters: FilterQuery<Product> = {};
- Si
filtersestá vacío, Mongo simplemente no aplica ningún filtro y devuelve todo. - Si se detectan
minPriceymaxPrice, se agrega la condición de rango. - Este patrón es escalable: puedes agregar filtros por descripción, nombre, marca o cualquier otro campo sin reestructurar la lógica [2:50].
¿Cómo funciona el operador de rango gte y lte en MongoDB?
Para filtrar por rango no se puede comparar con igualdad directa. MongoDB ofrece operadores especiales dentro del documento de consulta [3:20]:
typescript if (minPrice && maxPrice) { filters.price = { $gte: minPrice, $lte: maxPrice }; }
- $gte (greater than or equal): filtra documentos cuyo precio sea mayor o igual al valor mínimo.
- $lte (less than or equal): filtra documentos cuyo precio sea menor o igual al valor máximo.
El objeto filters se pasa directamente al método find junto con la paginación, y Mongoose se encarga de traducirlo a la consulta correcta.
¿Cómo verificar que los filtros funcionan correctamente?
Al probar en Insomnia sin limit ni offset, se valida el comportamiento paso a paso [3:50]:
- Enviar solo
minPrice=50sinmaxPriceproduce un error de validación indicando quemaxPricees obligatorio y debe ser positivo. La condicional deValidateIffunciona. - Enviar
minPrice=50ymaxPrice=80retorna productos con precios de 50, 60, 70 y 80 [4:15]. - Cambiar el rango a
minPrice=10ymaxPrice=30devuelve productos de 10, 20 y 30 [4:30].
Este patrón de filtros dinámicos es reutilizable en cualquier controlador. Puedes extenderlo para buscar por precio exacto, por nombre de producto o por categoría, simplemente agregando condiciones al objeto filters antes de ejecutar la consulta.