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:
List < T > filters(Bson filter,Document... docSort)
List<T> filtersPagination(Bson filter, Integer pageNumber, Integer rowsForPage, Document... docSort)
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
Se pueden pasar directamente al método.
Filtros
Comparación
ninguno de los valores de un arreglo
Lógicas
selecciona todos los documentos que no cumplen las condiciones
Arrays
Busca arreglos que contienen los elementos específicos en la consulta.
Selecciona todos los documentos si un elemento del array coincide con todo lo especificado en $elemMatch
Selecciona todos los documentos si el campo del array es un tamaño especifico.
Elementos
Selecciona documentos que tienen el campo específico
Selecciona todos los documentos tiene el campo de ee tipo
Evaluación
Performs a modulo operation on the value of a field and selects documents with a specified result.
Selects documents where values match a specified regular expression
Selects documemts matching a full-text search expression
Matches documents that satisfy a JavaScript expression.
Ejemplos Filtros
Copy 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
Copy Bson filter =Filters.eq("pais","cuba");
List< Paises > list =paisesRepository.filters(filter);
Filtra todos los documentos con logo = "" y los ordena por país.
Copy Bson filter =Filters.eq("logo","");
List< Paises > list =paisesRepository.filters(filter,new Document("pais",1));
AND Busca por la condicion logo = “” y poblacion =8579
Copy 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
Copy 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
Copy 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":
Copy 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
Copy Bson filter = Filters.and(
Filters.exists("poblacion"),
Filters.nin("poblacion", 0,8579)
);
List < list > =paisesRepository.filters(filter);
Filters con fecha
Copy 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.
Copy 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
Copy 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
Copy 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 :;
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.,
Copy 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
Copy ordenList = ordenRepository.filtersPagination(and(eq("activo",si),eq("anulado"no)), page, rowPage, new Document("idorden", -1));