Consultas avanzadas en MongoDB utilizando MongoRepository en Java

La integración de MongoDB con Spring Framwork ofrece abstracciones potentes para la manipulación de datos. Principalmente, existen dos aproximaciones: el uso de MongoTemplate, que requiere una escritura manual de las operaciones, y MongoRepository, que proporciona una interfaz de alto nivel para realizar operaciones CRUD y consultas complejas de manera casi automática.

1. Definición del Modelo de Datos

Para comenzar, definimos una entidad que represente el documento en la base de datos. En este ejemplo, utilizaremos una clase denominada Usuario.

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;

@Document(collection = "usuarios")
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    private String uid;
    private String nombrecompleto;
    private int años;

    // Getters y Setters
}

2. Creación del Repositorio

Al extender de MongoRepository, obtenemos acceso inmediato a métodos estándar sin necesidad de implementarlos.

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UsuarioRepository extends MongoRepository<Usuario, String> {
    // Definiremos métodos personalizados aquí más adelante
}

3. Implementación de Consultas en la Capa de Servicio

Inyectamos el repositorio en nuestra lógica de negocio para ejecutar las operaciones.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

@Service
public class GestionUsuariosService {
    @Autowired
    private UsuarioRepository repositorio;

    // 1. Obtener todos los registros
    public List<Usuario> listarTodo() {
        return repositorio.findAll();
    }

    // 2. Paginación de resultados
    // Nota: El índice de páginas en Spring Data comienza en 0
    public Page<Usuario> listarConPaginacion(int nroPagina, int tamaño) {
        PageRequest configuracionPagina = PageRequest.of(nroPagina, tamaño);
        return repositorio.findAll(configuracionPagina);
    }

    // 3. Conteo total de documentos
    public long obtenerTotal() {
        return repositorio.count();
    }
}

4. Consultas Derivadas por Nombre de Método

Spring Data permite generar consultas automáticamente analizando el nombre del método en la interfaz del repositorio.

En el Repositorio:

// Búsqueda exacta
Usuario findByNombrecompleto(String nombre);

// Búsqueda parcial (Like)
List<Usuario> findByNombrecompletoLike(String fragmento);

// Búsqueda parcial con paginación
Page<Usuario> findByNombrecompletoLike(String fragmento, Pageable pageable);

5. Uso de Proyecciones y la anotación @Query

Si necesitamos filtrar los campos devueltos para optimizar el rendimiento (por ejemplo, omitir la edad y solo traer el nombre), utilizamos la anotación @Query.

En el Repositorio:

import org.springframework.data.mongodb.repository.Query;

// value define el filtro, fields define qué columnas retornar (1 para incluir)
@Query(value = "{'nombrecompleto': ?0}", fields = "{'nombrecompleto': 1, 'uid': 1}")
Page<Usuario> buscarSoloNombres(String nombre, Pageable pageable);

Para buscar todos los registros donde un campo no sea nulo y aplicar proyecciones:

@Query(value = "{'_id': {'$ne': null}}", fields = "{'nombrecompleto': 1}")
Page<Usuario> recuperarNombresExistentes(Pageable pageable);

6. Operadores Lógicos y de Comparación

A continuación se presentan ejemplos de cómo estructurar métodos en el repositorio para diferentes condiciones lógicas de MongoDB:

  • Mayor que (Greater Than): findByAñosGreaterThan(int limite)
    Equivalente BSON: {"años": {"$gt": limite}}
  • Menor que (Less Than): findByAñosLessThan(int limite)
    Equivaletne BSON: {"años": {"$lt": limite}}
  • Rangos (Between): findByAñosBetween(int min, int max)
    Equivalente BSON: {"años": {"$gt": min, "$lt": max}}
  • Negación (Not): findByNombrecompletoNot(String nombre)
    Equivalente BSON: {"nombrecompleto": {"$ne": nombre}}
  • Geolocalización (Near): findByUbicacionNear(Point punto)
    Equivalente BSON: {"ubicacion": {"$near": [x, y]}}

Esta estructura permite una gestión robusta de los datos en MongoDB sin la verbosidad de escribir consultas manuales, delegando la responsabilidad de la persistencia a la enfraestructura de Spring Data.

Etiquetas: java MongoDB Spring Boot Spring Data MongoDB MongoRepository

Publicado el 6-24 23:27