MongoDB

Qué trae MongoDB 2.6 para los desarrolladores

Ahora que la versión 2.6 de MongoDB ha sido liberada, quiero explicar en términos generales aquellas características que desde el punto de vista de un desarrollador deben tenerse en cuenta. Esta versión es la más grande que hasta ahora se ha liberado, por lo que es muy emocionante hablar de ella.

Full Text Search

Full Text Search o Búsqueda de texto completo ahora estará completamente soportada y lista para ser usada en ambientes de producción.

Para ser exactos, esta característica fue introducida en la versión 2.3.2 (Versión de desarrollo 2.4) y para poder ser utilizada debía ser activada por medio del parámetro textSearchEnabled. Full Text Search en MongoDB es soportado con muchos idiomas, incluyendo el español, por lo que va a ser muy divertido crear aplicaciones que hagan uso de esta funcionalidad.

MongoDB otorga esta funcionalidad con la ayuda de la librería Snowball, que es una librería escrita en C que proporciona stemming.

Mejoras en Aggregation Framework

Cursores como resultado de agregación

Anteriormente MongoDB sólo podía retornar un documento como resultado de una operación de agregación, por lo que probablemente estábamos forzados a incluir un operador $limit al final de nuestro pipeline para no exceder el tamaño límite de un documento, que es 16MB.

En cambio, ahora es posible recibir un cursor para una operación de agregación estableciendo como segundo parámetro la opción “cursor”, y como valor de esta clave, un objeto que señale el tamaño inicial del lote con la clave “batchSize”.

> db.coleccion.aggregate([ … ], { cursor: { batchSize: 0 } })

Este tamaño le especifica al servidor el número de documentos que deberá retornar en el primer lote; de tal manera que si le establecemos 0 como en el ejemplo, nos servirá para obtener una respuesta satisfactoria o de error con el más mínimo esfuerzo para tus instancias de MongoDB. Ten en cuenta que es algo muy similar a lo que podemos establecer con el método batchSize, con la única diferencia afecta sólo al primer lote retornado en el cursor.

Explain para agregación

También ahora puedes aprovechar que Aggregation Framework es capaz de retornar la información de una consulta. Al igual que para recibir un cursor como resultado, el método aggregate evalúa el segundo parámetro buscando la clave “explain”, de esta manera:

> db.coleccion.aggregate([ … ], { explain: true })

El método aggregate considera que el primer parámetro es el pipeline siempre y cuando sea un array, en caso contrario considera que el pipeline es un array que tiene agrupado a todos los parámetros con los que el método es invocado. Así que siempre que quieras utilizar las opciones para este método, es necesario que te asegures que el primer parámetro es realmente un array.

Resultado hacia una colección

El resultado de una operación de agregación ahora también puede ser escrita en una colección nueva o existente. Puedes incluir al final del pipeline de agregación un objeto con un operador $out, este operador debe siempre poseer como valor una cadena que indique el nombre de la colección que será utilizada para escribir los resultados.

Así por ejemplo, en la siguiente operación, los resultados serían insertados en una colección llamada “resultante”:

> db.coleccion.aggregate([ … , { $out: “resultante” }])

Si la colección donde serán insertados los resultados existe, los documentos que tenga esta colección serán reemplazados por el resultado de la operación de agregación; cabe mencionar que esto no modificará los índices que ya podría tener creados. Por el contrario, si se trata de una colección que no existe, simplemente es creada. Asimismo, hay que tener en consideración que el resultado no puede ser escrito en una colección con tope.

Operadores de conjuntos

O también llamados “set operators”, estos operadores como su nombre bien los menciona son utilizados para realizar operaciones de conjuntos en el pipeline de agregación.

Existen operadores para obtener la diferencia entre conjuntos, también la inclusión, la diferencia, la unión y la comparación. Puedes ver la especificación de todos estos operadores en el Manual.

Mejoras en operaciones actualización

Operadores $max y $min

Estos son operadores condicionales, los cuales pueden ser aprovechados para actualizar campos atómicamente.

Por ejemplo, en nuestras aplicaciones, si antes primero teníamos que consultar un documento, luego evaluar su contenido y finalmente realizar la actualización; quizás algo muy parecido a esto (En Python):

>>> min = 400
>>> doc = db.coleccion.find_one(criterio)
>>> db.coleccion.update(criterio, {”$set": {"campo": min if min < doc['campo'] else doc['campo']}})

De esa manera no se podía asegurar que en un escenario de alta concurrencia, tengamos exactamente el valor que deseamos. Ahora, lo podemos hacer simplemente ejecutando la siguiente operación:

>>> min = 400
>>> db.coleccion.udpate(criterio, {“$min”: min})

Los objetivos son los mismos para $max y $min, el valor del campo se establecerá de acuerdo a si se desea modificar por el mayor o menor valor, entre el existente y el nuevo que se está enviando en la actualización.

Operador $mul

Al igual que $min y $max, $mul funciona atómicamente y es ideal para el uso en escenarios concurrentes. Lo que hace este operador es aplicar una multiplicación al valor existente del campo que se desea actualizar. Por ejemplo, si deseo multiplicar el valor existente por 5, sería algo así:

>>> factor = 5
>>> db.coleccion.update(criterio, {“$mul”: factor})

Tener en cuenta que si el campo que desea ser actualizado no existe en el documento, el producto que obtendrá será 0.


Estas y otras características que vienen con MongoDB 2.6 están relatadas en el documento de notas de versión en el Manual de MongoDB. Visita siempre el Manual, ahí se encuentra siempre bien documentados, los cambios y las nuevas funcionalidades.

Standard