Búsquedas en mongoDB

find()

Sin argumentos devuelve toda la colección. En el caso de que la colección sea extensa, devuelve solo un grupo, y se mantiene un cursor en el servidor. Los argumentos funcionan igual que en el caso anterior.

Expresiones $gt, $lt, $gte… etc.

Para incluir condiciones, del tipo “propiedad: mayor o igual que”, se añade en el valor a comparar un documento, por ejemplo:

Si nos fijamos, lo que se busca es que “cantidad”, sea mayor o igual a 20 y menor o igual a 30, y esto se hace con un subdocumento “{ $gte : 20 , $lte : 30 }”.

En el caso de las cadenas de texto, $gt, $lt… etc, devuelve las que quedan en orden alfabético entre los valores proporcionados. El orden es el de los caracteres en UTF-8. Por ejemplo:

Hay que tener en cuenta que como mongo-db es “squemaless”, en una misma clave, podríamos almacenar una cadena de texto y el número 4, por ejemplo, que con la consulta anterior no sería devuelto, ya que no efectúa la conversión de tipos.

Expresiones $regulares, $exists y $type

Como hemos comentado, las colecciones no tienen un esquema rígido. Puede que exista un elemento con una propiedad determinada y otros que no la tengan. Por ejemplo:

Si lo que queremos es obtener los obtener los objetos que tengan una determinada propiedad, podemos hacer lo siguiente (indicamos que no muestre el id):

Si quisiéramos los que no poseen la propiedad, pondríamos:

{“numero”:{$exists:false} }

Para preguntar por los elementos que son de tipo string:

Los tipos se corresponden con los de BSon, según la siguiente tabla:

Tipos BSon

Tipos BSon

Podemos utilizar expresiones regulares. Por ejemplo, nombres que contienen “an”:

O los que terminan en “n”:

Los que empiezan por “R”:

Los documentos que tienen la propiedad “email” y que contienen la letra “c” en la propiedad “nombre”

Expresión $or

Esta expresión, como primer operador recibe un operador $or, y como argumento un array ( ojo, que despues del $or van dos puntos):

Otro ejemplo, documentos que tengan la propiedad “precio” menor que 60 o mayor que 80:

Expresiones $and

Esta expresión, es similar a la anterior:

En realidad, es equivalente a:

Hay que tener cuidado con consultas como la siguiente:

Lo que en realidad devuelve, son los productos con precio menor a 99. Lo que ocurre, es que en primer lugar, javascript inicializa la variable precio con un documento $gt:30, y cuando lee el segundo atributo, machaca el valor con el $lt:99. Para estos casos, viene bien el operador $and

Consultas dentro de Arrays

Podemos saber si un array contiene un determinado elemento, del siguiente modo:

Como vemos, devuelve las colecciones, que tienen un array que contenga “pipas”. También observamos que devuelve coincidencias, aunque no se trate de un array, como ocurre en el último caso. Si queremos encontrar más de un valor en el array, no nos devolverá datos, a no ser que le indiquemos el mismo array, con el mismo número de elementos y en el mismo orden:

Usando $in y $all

Podemos buscar si un array contiene todos los elementos que le indiquemos, independientemente del orden:

Por otro lado, si lo que queremos es encontrar los documentos que tengan algún elemento de los que indicamos, usaremos $in, que es similar a SQL:

Consultas con la notación punto

Cuando consultemos por un objeto que esté dentro de otro objeto, no nos devolverá resultados, a no ser que se consulte exactamente por el objeto embebido completo. Si queremos consultar por una propiedad de dicho objeto, usamos el punto (Ojo, hay que ponerlo entre comillas):

Cursores

Cuando ejecutamos una consulta, la consola de mongo, nos escribe directamente la respuesta. Si queremos tener más control sobre la consulta, podemos utilizar los cursores. Por ejemplo:

Con el primer null, indicamos que no queremos volcar el resultado a consola. El resultado de la consulta anterior es este null que vemos más arriba.

Ahora con el currsor, podemos preguntar si tiene más valores y pedírselos:

Podemos limitar el tamaño del cursor, para que nos devuelva menos valores:

Por otro lado podemos ordenar los resultados (1 ascendente, -1 descendente):

También se pueden saltar elementos. Vamos a probar varias a la vez:

Del mismo modo, podemos emplear esto, directamente en una consulta:

Contando resultados

Podemos contar los resultados de una consulta. Es igual que usando find(), solo que con count():

Aquí terminamos con este artículo. En el siguiente hablaremos sobre la actualización de documentos:

3 comentarios:

  1. bueno tu post—- no hay muchos en MongoDB y gracias porque me ayudo mucho en mi investigacion—– de nuevo gracias desde aqui Lima-Peru

  2. Hola-
    Cómo harías esta consulta
    ¿Cuales son las 10 mujeres con mayor edad?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *