Cuando estemos realizando consultas MongoDB es fácil que necesitemos concatenar filtros en las consultas. Es decir necesitemos realizar el operador MongoDB AND.
Por ejemplo, en nuestra colección de ciudades:
{ "_id" : ObjectId("525ab02733b01a66a9dcbc5b"), "ciudad" : "Madrid", "habitantes" : 3233527 } { "_id" : ObjectId("525ab02733b01a66a9dcbc5c"), "ciudad" : "Barcelona", "habitantes" : 1620943 } { "_id" : ObjectId("525ab02733b01a66a9dcbc5d"), "ciudad" : "Valencia", "habitantes" : 797028 } { "_id" : ObjectId("525ab02733b01a66a9dcbc5e"), "ciudad" : "Sevilla", "habitantes" : 702355 } { "_id" : ObjectId("525ab02733b01a66a9dcbc5f"), "ciudad" : "Zaragoza", "habitantes" : 679624 }
Podemos querer el consultar por el nombre de la ciudad y por el número de habitantes. Lo que buscaremos realizar con el operador MongoDB AND es filtrar por ciudades que empiecen por una letra y cuyos habitantes sean mayor de un número indicado.
El operador MongoDB AND tiene la siguiente estructura:
db.coleccion.find({$and:[{filtro1},{filtro2},...{filtroN}]});
Dónde los filtros podrán ser de cualquier tipo de los que soporta MongoDB.
De esta forma, para poder escribir el filtro con el operador MongoDB AND que hemos comentado antes tendremos la siguiente sentencia:
cursor = db.ciudades.find({$and:
[{ciudad:/^M/},{habitantes:{$lt:1000000}}]});
Vemos que dentro del documento asociado al AND va un array con los filtros, que a su vez tienen la estructura BSON. Todos ellos separados por comas.
Aunque MongoDB tiene otros operadores adicionales como $or, $eq, $neq,… El operador MongoDB AND o $and se puede asumir en la propia consulta, de forma implicita, en una secuencia de filtros. Es decir, que podríamos escribir la consulta .find() de la siguiente forma:
db.coleccion.find({filtro1,filtro2,...filtroN});
Por lo que reescribiendo el anterior uso del operador MongoDB AND tendríamos lo siguiente de forma implicita:
cursor = db.ciudades.find({ciudad:/^M/,habitantes:{$lt:1000000}});
Como en todos los ejemplos, al dejar el resultado de los documentos sobre un cursor, solo nos queda el volcar el cursor:
while (cursor.hasNext()){
printjson(cursor.next());
}