Consultas Avanzadas con Rangos de Precios en MongoDB
Clase 16 de 24 • Curso de NestJS: Persistencia de Datos con MongoDB
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
Los endpoints del tipo GET, además de paginar la información, pueden tener otro tipo de filtros más específicos para una regla de negocio. MongoDB permite crear cualquier tipo de filtro que necesite tu servicio.
Filtro de rango numérico
Crear un filtro entre dos números X e Y que podrían ser años o precios de productos es un caso de uso bastante habitual en la consulta de datos.
Paso 1: tipado de datos
Comienza creando el DTO para que el constructor reciba estos datos.
// products/products.dto.ts
import { ValidateIf } from 'class-validator';
export class FilterProductsDto {
@IsOptional()
@Min(0)
minPrice: number;
@ValidateIf((params) => params.minPrice)
@IsPositive()
maxPrice: number;
}
Utilizamos el decorador @ValidateIf() para validar el precio máximo solo si existe el mínimo y también es válido.
Paso 2: preparar el servicio para el filtro
Preparar el servicio para recibir estos nuevos datos y filtrar por rango mínimo y máximos un determinado campo del esquema.
// products/products.service.ts
import { Model, FilterQuery } from 'mongoose';
@Injectable()
export class ProductsService {
findAll(params?: FilterProductsDto) {
if (params) {
const filters: FilterQuery<Product> = {};
const { minPrice, maxPrice } = params;
if (minPrice && maxPrice) {
filters.price = { $gte: minPrice, $lte: maxPrice };
}
return this.productModel.find(filters).exec();
}
return this.productModel.find().exec();
}
}
Para crear el filtro de rangos máximos y mínimos, MongoDB utiliza operadores de comparaciones especiales:
De esta manera, el servicio está preparado para realizar un filtro numérico si el usuario ingresa el rango. Recuerda que este tipo de filtros suelen ser opcionales, el endpoint debe seguir funcionando correctamente en el caso de que no se ingrese un filtro.
Contribución creada por: Kevin Fiorentino (Platzi Contributor).
Código de ejemplo para filtro de rango de precios
// src/products/dtos/products.dtos.ts
import {
...,
ValidateIf // 👈 new decorator
} from 'class-validator';
export class FilterProductsDto {
...
@IsOptional()
@Min(0)
minPrice: number; // 👈 new field
@ValidateIf((params) => params.minPrice)
@IsPositive()
maxPrice: number; // 👈 new field
}
// src/products/services/products.service.ts
import { Model, FilterQuery } from 'mongoose';
@Injectable()
export class ProductsService {
...
findAll(params?: FilterProductsDto) {
if (params) {
const filters: FilterQuery<Product> = {}; // 👈 create filters
const { limit, offset } = params;
const { minPrice, maxPrice } = params; // 👈
if (minPrice && maxPrice) {
filters.price = { $gte: minPrice, $lte: maxPrice };
}
return this.productModel.find(filters).skip(offset).limit(limit).exec();
}
return this.productModel.find().exec();
}
..
}