martes, 21 de octubre de 2014

Instalación del driver de MongoDB en Python

Para desarrollar aplicaciones Python basadas en la base de datos MongoDB

, es necesario instalar PyMongo, el driver oficial para Python

Instalación en Linux

La forma más sencilla de instalar PyMongo es mediante el siguiente comando:

$ easy_install pymongo

Si no lo tienes, puede instalarlo mediante el siguiente comando:

sudo apt-get install python-setuptools

Otra forma de instalarlo es mediante el gestor de paquetes pip. Si no lo tienes instalado, puedes adquirirlo mediante el siguiente comando:

$ sudo apt-get install python-pip

A continuación instalamos el driver mediante el siguiente comando:

$ pip install pymongo

Instalación en Windows

Para Windows disponemos de instaladores estándar. Basta con descargar el archivo .exe del driver más reciente de:

https://pypi.python.org/pypi/pymongo/#downloads

Y lanzar el instalador.

Probando PyMongo

Nada mejor que un ejemplo práctico para comprobar el funcionamiento de PyMongo. Para ello, crearemos un fichero llamado demoMongoDB.py, con el siguiente código:

from pymongo import MongoClient

conexion = MongoClient('localhost', 27017)
basedatos = conexion.pruebas
coleccion = basedatos.pruebas

print "Num. documentos:", coleccion.count()

for doc in coleccion.find():
   print doc

En la primera línea importamos el driver pymongo y la clase MongoClient, la cual gestiona una conexión cliente a la base de datos. A continuación creamos una conexión a una base de datos MongoDB localizada en nuestra propia máquina (localhost) y en el puerto estándar (27017). Después, desde la conexión, abrimos la base de datos pruebas. Después, desde la base de datos abierta, abrimos la colección pruebas. A continuación, visualizamos el número de documentos que tiene la colección. Por último, visualizamos todos los documentos de la colección.

Más info:

Instalación del driver de MongoDB para PHP

Instalación en Linux

Antes de proceder a la instalación y configuración del driver de MongoDB en Linux, es necesario tener instalado antes pecl. Si no lo tienes instalado, utiliza el siguiente comando:

sudo apt-get install php5-dev php5-cli php-pear

Para utilizar MongoDB desde PHP, primero hay que descargar el driver correspondiente en la siguiente URL:

http://pecl.php.net/package/mongo

Una vez descargado, procedemos a descomprimir el archivo y a compilar y a instalar el driver mediante los siguientes comandos:

$ tar zxvf mongodb-mongodb-php-driver-.tar.gz
$ cd
$ phpize
$ ./configure
$ make all
$ sudo make install

Debería mostrar un mensaje como el siguiente:

Installing shared extensions: /usr/local/lib/php/extensions/no-debug-zts-20121212/

La instalación debería configurar el archivo php.ini, apuntando al archivo mongo.so a través del parámetro extensions. Para verificarlo, primero localizamos el archivo mongo.so mediante el siguiente comando:

$ sudo find / -name mongo.so

Ese archivo debería estar localizado en el directorio

/usr/local/lib/php/extensions/no-debug-zts-<fecha>

Para verificar si se ha configurado correctamente, ejecutaremos el siguiente comando:

$ php -i | grep extension_dir

El resultado debería ser similar al siguiente:

extension_dir => /usr/local/lib/php/extensions/no-debug-zts-20121212 => /usr/local/lib/php/extensions/no-debug-zts-20121212

Después, modificar el archivo php.ini y configurar el siguiente parámetro:

extension=mongo.so

Por último, reiniciar el servidor de Apache.

Instalación en Windows

La instalación en Windows es más sencilla. Lo primero que hay que hacer es descargar la última versión del driver en la siguiente URL:

https://s3.amazonaws.com/drivers.mongodb.org/php/index.html

A continuación, descomprimir el archivo descargado y copiar el archivo php_mongo.dll en el directorio de extensiones PHP, el cual, normalmente, se llama ext.

Después, modificar el archivo php.ini y añadir la siguiente línea:

extension=php_mongo.dll

Por último, reiniciar el servidor de Apache.

domingo, 19 de octubre de 2014

Fechas en MongoDB

MongoDB es una base de datos muy potente a la hora de utilizar valores de fecha. En este artículo analizaremos cómo gestionar correctamente las fechas y cómo encontrar los datos en base a fechas.

Agregar fechas

La forma más sencilla de insertar una fecha es la siguiente:

> db.coleccion.insert({"fecha" : new Date()})

El comando anterior agrega un nuevo documento a la colección, con un campo fecha que contendrá la fecha y hora actuales. Si listamos el contenido del documento, obtendremos un resultado como el siguiente:

> db.coleccion.find()

{ "_id" : ObjectId("5443e87e5894b090804c822e"), "fecha" : ISODate("2014-10-19T16:36:14.197Z") }

El tipo de dato ISODate contendrá la fecha en formato internacional (año-mes-día), seguido de la hora con precisión de milésimas de segundo.

Para agregar una fecha específica sin especificar la hora, se puede utilizar la función Date() con el siguiente formato:

> db.coleccion.insert({fecha: new Date("2014, 10, 21")})

Si queremos agregar una fecha y hora concretas, podemos utilizar el tipo ISODate() como función para especificar el valor:

> db.coleccion.insert({fecha: ISODate("2014-10-19T18:56:20.197Z")})

Búsqueda de fechas

Para hacer una búsqueda exacta (por fecha y hora), podemos utilizar el siguiente formato:

> db.coleccion.find({"fecha" : ISODate("2014-10-20T22:00:00Z")})

{ "_id" : ObjectId("5443f41b5894b090804c8234"), "fecha" : ISODate("2014-10-20T22:00:00Z") }

Si deseamos buscar todos los documentos a partir de una fecha específica:

> db.coleccion.find({"fecha" : {"$gt" : ISODate("2014-10-18T00:00:00")}})

También podemos utilizar la siguiente sintaxis:

> db.coleccion.find({"fecha" : {"$gt" : new Date("2014-10-18")}})

En ambos casos indicamos a la función find() (encontrar) que compare el campo "fecha" con el valor a buscar, que es un nuevo documento que contiene el operador "$gt" (greater than ó mayor que) y la fecha a partir de la cual debe hacer coincidir el resultado.

Los operadores condicionales utilizados por MongoDB para evaluar las condiciones de los valores a encontrar son los siguientes:

  • $gt: greater than (mayor que)
  • $gte: greater than or equal (mayor o igual que)
  • $lt: less than (menor que)
  • $lte: less than or equal (menor o igual que)
  • $ne: not equal (distinto de)
  • $in: in (dentro de(un array)
  • $nin: not in (no dentro de (un array))

Por ejemplo, si deseamos encontrar aquellos documentos que se encuentren entre dos fechas dadas:

> start = ISODate("2014-10-18T00:00:00Z")
ISODate("2014-10-18T00:00:00Z")
> end = ISODate("2014-10-20T00:00:00Z")
ISODate("2014-10-20T00:00:00Z")
> db.coleccion.find({"fecha" : {"$gte" : start, "$lte" : end}})

Al encadenar una lista de criterios a evaluar, por defecto asumirá que se aplica una operación lógica "$and". Lo anterior sería lo mismo que este comando:

> db.coleccion.find({"$and" : [{"fecha" : {"$gte" : start}}, {"fecha" : {"$lte" : end}}]})

Si queremos omitir el rango anterior utilizaríamos el operador lógico "$or":

> db.coleccion.find({"$or" : [{"fecha" : {"$lt" : start}}, {"fecha" : {"$gt" : end}}]})

Los operadores lógicos utilizados por MongoDB son los siguientes:

  • $and: Todas las condiciones del array se deben cumplir
  • $or: Se debe cumplir, al menos, una condición del array
  • $not: Invierte la condición.

Puede ocurrir que deseemos obtener documentos que se encuentren entre una lista de posibles coincidencias. Para ello, utilizaremos el operador condicional "$in", seguido de un array con la lista de valores a evaluar:

> db.coleccion.find({"fecha" : {"$in" : [ISODate("2014-10-20T22:00:00Z"), ISODate("2014-10-19T18:56:20.197Z"), ISODate("2014-10-15T18:56:20.197Z")]}})

En el caso de que quisiéramos cualquier documento excepto los que se encuentran en la lista, utilizaríamos el operador condicional "$nin".

Optimización de las búsquedas

Para que nuestras búsquedas sean mucho más rápidas y eficientes, necesitaríamos indexar la colección por el campo fecha:

> db.coleccion.ensureIndex({"fecha" : 1})
{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

El comando ensureIndex permite crear un índice en base a la lista de campos especificados. Con un valor 1, indicamos que el campo esté ordenado de alfabéticamente o de menor a mayor. Si el valor fuese -1, el orden sería a la inversa.