Cursores en MongoDB

cursores en MongoDBSeguimos con la serie de artículos relacionados con las operaciones CRUD en MongoDB (Create, Read, Update, Delete). En el último artículo se mostró como realizar Consultas en MongoDB usando dot notation o notación por punto. Ahora, llega el turno de los cursores en MongoDB.

Crear cursores en MongoDB

Los cursores son usados para iterar o recorrer secuencialmente los resultados devueltos por una determinada consulta. Por defecto, en el shell de MongoDB, se muestra el resultado de la consulta por lo que se puede añadir una sentencia null para evitar que salga por pantalla toda esa información:

> cur = db.people.find(); null;

Con este comando se crea una consulta cuya salida se asocia al cursor “cur”. Ahora,  se puede usar dicho cursor para ir obteniendo documentos secuencialmente. Para esto, primero se debe comprobar si existe un documento antes de requerirlo al cursor.

Para comprobar si existe un documento siguiente al actual (o el primero si es la primera vez que se invoca) se usa el método “hasNext” del cursor:

> cur.hasNext()
true

Y para obtener el siguiente documento (o el primero si es la primera vez que se invoca) de la consulta se usa el método “next“:

> cur.next()
{
    "_id" : ObjectId("5138ecaa3929ab2874366295"),
    "name" : "Jose David",
    "age" : 28
}

Como se puede apreciar, los métodos poseen el mismo nombre que cualquier iterator en lenguajes de programación como Java o JavaScript. Combinando los dos métodos anteriores se pueden recorrer todos los elementos del cursor usando un bucle while:

Se crea el cursor:

> cur = db.people.find(); null;
null

Y se recorre al igual que cualquier iterator:

> while (cur.hasNext()) printjson(cur.next())
{
"_id" : ObjectId("5138ecaa3929ab2874366295"),
"name" : "Jose David",
"age" : 28
}
{
"_id" : ObjectId("5138ed573929ab2874366296"),
"name" : "Jose David",
"age" : 28
}
{ "_id" : ObjectId("513900c13929ab2874366e50"), "name" : "Bob" }
{ "_id" : ObjectId("513900c53929ab2874366e51"), "name" : "Charlie" }
...

Es necesario usar “printjson” para mostrarlo en formato JSON ya que “next” devuelve el documento en formato BSON y con “print”, por ejemplo, no se mostraría el contenido del documento correctamente.

> while (cur.hasNext()) print(cur.next())
[object bson_object]
[object bson_object]
[object bson_object]

En los siguientes apartados se va a mostrar como personalizar cursores en MongoDB, esto no es ni más ni menos que ver cómo se puede ordenar un cursos o limitar el número de documentos que devuelve la consulta.

Limitar cursores en MongoDB

Para un obtener un cierto número de elementos se puede usar el método “limit“.

cur.limit(5); null;

Con el método limit se limita el número de documentos que forman el resultado de la consulta al número N indicado (5 en este caso), es decir, sólo se podrán consultar los primeros N documentos. Si se elimina la sentencia null simplemente se mostrarían dichos documentos por pantalla.

Ordenar cursores en MongoDB

Los cursores pueden ser ordenados por una o varias de las claves que posean los documentos resultado de la consulta, tanto en orden ascendente como descendente. Para ello, se usa el método “sort” que recibe como parámetros cada una de claves de ordenación junto con su orden (1 para ascendente o natural y -1 para descendente o inverso).

En este caso vamos a ver cómo ordenar el cursor en orden lexicográfico inverso (codificación UTF-8 por defecto) por el campo “name”:

> cur = db.people.find(); null;
null
> cur.sort({ name: -1 }); null;
null
> while (cur.hasNext()) printjson(cur.next())
...
{ "_id" : ObjectId("513900cc3929ab2874366e52"), "name" : "Happy Minds!" }
{ "_id" : ObjectId("513900c53929ab2874366e51"), "name" : "Charlie" }
{ "_id" : ObjectId("513900f03929ab2874366e54"), "name" : "Brad" }
{ "_id" : ObjectId("513900c13929ab2874366e50"), "name" : "Bob" }
...

Del mismo modo, se pueden usar “sort” y “limit” conjuntamente:

> cur.sort({ name: -1 }).limit(2);
{ "_id" : ObjectId("513900d63929ab2874366e53"), "name" : "Peter" }
{ "_id" : ObjectId("5138ecaa3929ab2874366295"), "name" : "Jose David", "age" : 28 }

Ignorar o saltar documentos en cursores en MongoDB

Otra funcionalidad interesante es “skip“, la cual permite ignorar los primeros N documentos encontrados y comenzar desde el documento N+1 como si fuese el primero.

Vamos a ver como ejemplo la consulta anterior saltándonos el primer documento (Peter):

> cur = db.people.find(); null;
null
> cur.sort({ name: -1 }).limit(2).skip(1);
{ "_id" : ObjectId("5138ecaa3929ab2874366295"), "name" : "Jose David", "age" : 28 }
{ "_id" : ObjectId("513900cc3929ab2874366e52"), "name" : "Happy Minds!" }

Conclusión

En este artículo del tutorial de MongoDB con Java se ha visto el manejo básico de los cursores en MongoDB, los cuales facilitan las operaciones de iteración y obtención de los documentos devueltos como resultado de una determinada consulta o búsqueda. Además, se pueden personalizar según se desee, pudiendo ordenar los resultados por determinadas claves, en el orden indicado (ascendente o descendente), así como limitar el total de los resultados obtenidos (muy útil para paginaciones por ejemplo).

Happy Minds!!!

Share on FacebookTweet about this on TwitterShare on LinkedInShare on RedditShare on Google+Digg thisShare on TumblrPin on PinterestBuffer this pagePrint this pageEmail this to someone