Busquedas con Filter and Pagination

Búsquedas con Filters MongoDB

Proporciona una métodos para ejecutar operaciones con los operadores.

Se implementa en base a Filters utilizado en MongoDB

Sintaxis:

Método

Base de datos NoSQL

List < T > filters(Bson filter,Document... docSort)

MongoDB

List<T> filtersPagination(Bson filter, Integer pageNumber, Integer rowsForPage, Document... docSort)

Filtra con paginación

Nota:

La definición de los operados esta basado en la documentación de referencia de MongoDB.

Guía de referencias de Filters en MongoDB

http://mongodb.github.io/mongo-java-driver/3.0/builders/filters/

Se pueden pasar directamente al método.

Filtros

Comparación

Predicado

Descripción

eq

igual

gt

mayor que

gte

mayor o igual

lt

menor

lte

menor o igual

ne

no es igual

in

busca algún valor

nin

ninguno de los valores de un arreglo

Lógicas

Operador

Descripción

and

y

or

o

not

no

nor

selecciona todos los documentos que no cumplen las condiciones

Arrays

Operador

Descripción

all

Busca arreglos que contienen los elementos específicos en la consulta.

elemMatch

Selecciona todos los documentos si un elemento del array coincide con todo lo especificado en $elemMatch

size

Selecciona todos los documentos si el campo del array es un tamaño especifico.

Elementos

Operador

Descripción

exists

Selecciona documentos que tienen el campo específico

type

Selecciona todos los documentos tiene el campo de ee tipo

Evaluación

Operador

Descripción

mod

Performs a modulo operation on the value of a field and selects documents with a specified result.

regex

Selects documents where values match a specified regular expression

text

Selects documemts matching a full-text search expression

where

Matches documents that satisfy a JavaScript expression.

Enlaces oficiales en MongoDB https://docs.mongodb.com/manual/reference/operator/query/text/

Ejemplos Filtros

  • Filtrar por anio y mes

Bson filter = Filters.and(Filters.eq("anio", reservado.getAnio()), Filters.eq("mes", reservado.getMes()));
List< Reservado> list = reservadoRepository.filters(filter, new Document("idreservado", 1));
  • Busca el documento con Pais = Cuba sin ordenar

 Bson filter =Filters.eq("pais","cuba");
 List< Paises > list =paisesRepository.filters(filter);
  • Filtra todos los documentos con logo = "" y los ordena por país.

 Bson filter =Filters.eq("logo","");
 List< Paises > list =paisesRepository.filters(filter,new Document("pais",1));
  • AND Busca por la condicion logo = “” y poblacion =8579

 Bson filter =Filters.and(Filters.eq("logo",""), Filters.eq("poblacion",8579));
 List< Paises > list =paisesRepository.filters(filter,new Document("pais",1));
  • OR Busca documentos con Logo =”” o Población 8579

 Bson filter =Filters.or(Filters.eq("logo",""), Filters.eq("poblacion",8579));
 List< Paises > list =paisesRepository.filters(filter,new Document("pais",1));
  • Busca Población 8579 o Población 4567 o País = España o Siglas = cu

  Bson filter =Filters.and( 
    Filters.or(
    Filters.eq("Poblacion", 8579),
     Filters.eq("Poblacion",4567),
     Filters.or(
      Filters.eq("Pais", "España"),
       Filters.eq("Siglas", "cu")
     )//or
     ) //or
    );//and

 List< Paises > list =paisesRepository.filters(filter,new Document("pais",1));

Ejemplos de Arrays

Selecciona todos los documentos con un arreglo Provincias que contienen ambas palabras "Los Santos" y "Herrera":

 Bson filter = Filters.all("Provincias", Arrays.asList("Los Santos", "Herrera"));
 List< Paises > list =paisesFacade.filters(filter,new Document("pais",1));

Ejemplos Elements

Busca que exista el campo Población y que no tenga valores de 0 o 8579

 Bson filter = Filters.and(
    Filters.exists("poblacion"),
    Filters.nin("poblacion", 0,8579)
 );

 List < list > =paisesRepository.filters(filter);

Filters con fecha

Bson filter = Filters.and(Filters.gte("fechainicio", permiso.getFechainicio()), Filters.lte("fechafin", permiso.getFechafin()));
 list = permisoRepository.filters(filter, new Document("idpermiso", -1));

 // con paginacion
 permisoList = permisoRepository.filtersPagination(filter, page, rowPage, new Document("idpermiso", -1));

Filtrar llave primaria y la fecha de un dia sin tomar en cuanta las horas y minutos

Se usa con documentos donde el usuario al crearlos almacena fecha y hora.

Bson filter = Filters.and( 
                   Filters.eq("agente.idagente",agente.getIdagente())
                        ,  Filters.gte("fechainicio", permisoSearch.getFechainicio()),
                 Filters.lte("fechainicio", permisoSearch.getFechainicio()));

Filtrar por año y mes

  Bson filter = Filters.and(Filters.eq("anio", reservado.getAnio()), Filters.eq("mes", reservado.getMes()));
  List< Reservado> list = reservadoRepository.filters(filter, new Document("pais", 1));

Filtros en un List<Entity> en posiciones diversas usando and y or

A veces necesitamos hacer filtros complejos sobre un List<>

Tenemos las clases

public class Orden {
    @Id
    private Integer idorden;
    private Date fecha;
    private String tipoorden;
    private String subtipoorden;
    private String observacion;
    private Integer idemisor;
    private String tipoemisor;

    @Referenced(documment = "Almacen", repository = "com.avbravo.storeejb.repository.AlmacenRepository",
            field = "idalmacen", javatype = "Integer", lazy = false)
    private Almacen almacen;

    @Referenced(documment = "Usuario", repository = "com.avbravo.storeejb.repository.UsuarioRepository",
            field = "username", javatype = "String", lazy = false)
    private List<Usuario> usuario;
    private String activo;

    @Embedded
    private List<UserInfo> userInfo;
    }



    public class Usuario {

    @Id
    private String username;
    private String nombre;
    private String password;
    private String email;
    private String telefono;
    private Double porcentajecomision;
    private String activo;
    private String direccion;

   @Referenced(documment = "Almacen",
            repository = "com.avbravo.storeejb.repository.AlmacenRepository",
            field = "idalmacen", javatype = "Integer", lazy = false)
    private List<Almacen> almacen;


    @Referenced(documment = "Rol", repository = "com.avbravo.storeejb.repository.RolRepository",
            field = "idrol", javatype = "String", lazy = false)
    private List<Rol> rol;

    @Referenced(documment = "Empresa", repository = "com.avbravo.storeejb.repository.EmpresaRepository",
            field = "idempresa", javatype = "Integer", lazy = false)
    private Empresa empresa;

    @Embedded
    private List<UserInfo> userInfo;

    public Usuario() {
    }

    }

Si hacemos una consulta a la colección, List<Usuario>.

Deseamos filtrar en List<Usuario>, el encargado de tienda si observamos para algunas condiciones del subtipoorden, este estará en la posición 2 y para otras condiciones del subtipo de orden lo encontraremos en la posición 1.

Tendremos que crear un filtro complejo en el cual para obtener el usuario.#.username puede ser 1 o 2 dependiendo de las condiciones :;

posición

subtipoorden

2

tiendaabodega

2

bodegaatienda

2

bodegaainterno

2

internoabodega

1

tiendaainterno

1

iternoatienda

En este caso lo encontramos en la posición 1 al encargado de tienda ya que subtipoorden="tiendaainterno"

En el caso que el sutipoorden=""tiendaabodega" el encargado de tienda estara en la posiciòn 2:

Creamos los filtros para que busque en la posición 2 o 1 en base al valor de subtipoorden.,

   Bson filter_1 =Filters.and(Filters.eq("usuario.2.username",encargadotienda.getUsername()),
                                         Filters.or(Filters.eq("subtipoorden","tiendaabodega"),
                                                        Filters.eq("subtipoorden","bodegaatienda"),
                                                        Filters.eq("subtipoorden","bodegaainterno"),
                                                        Filters.eq("subtipoorden","internoabodega")));

   Bson filter_2 =Filters.and(Filters.eq("usuario.1.username",encargadotienda.getUsername()),
                                             Filters.or(Filters.eq("subtipoorden","tiendaainterno"),
                                                        Filters.eq("subtipoorden","iternoatienda")));


  Bson filter =Filters.or(filter_1, filter_2);

  ordenList = ordenRepository.filtersPagination(filter, page, rowPage, new Document("idorden", -1));

Filtros directos

ordenList = ordenRepository.filtersPagination(and(eq("activo",si),eq("anulado"no)), page, rowPage, new Document("idorden", -1));

Last updated