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
Was this helpful?