Los datos ya no se manejan como tablas y registros, sino que son conocidos como colecciones de documentos, de esta forma desaparecen las relaciones entre tablas y surge una nueva oportunidad y es crear documentos con estructuras diferentes sin tener que definirlas previamente.
Entorno de pruebas - Instalación
Para poder ejecutar las diferentes consultas que veremos durante este tutorial vamos a necesitar establecer nuestro entorno de pruebas, con ello podremos aprender mientras hacemos los ejemplos, reforzando así todos los conceptos que puedan ser nuevos.
La instalación de este tutorial está hecha en Windows 7 pero dependiendo de nuestro sistema operativo podemos ir a mongodb.org y buscar la sección de descargas, dentro conseguiremos las diferentes versiones tanto para Linux como Mac o Solaris.
Una vez que descargamos e instalamos la versión correspondiente, debemos iniciar el daemon mongod, en el caso de Windows es mongod.exe, pero para que funcione adecuadamente debemos crear un directorio o carpeta de datos preferiblemente en una ruta que no necesite permisos de administrador y al iniciar mongod.exe le indicamos que debe tomarla. El comando de inicio es el siguiente:
$rutaMongodb/ mongod.ex - - dbpath “Unidad:\db\data”Donde rutaMongodb es la carpeta donde hicimos la instalación y Unidad es la letra del disco duro donde se encuentra la ruta para acceder a db\data, si todo ha iniciado exitosamente veremos algo como lo siguiente:
En la pantalla anterior debemos localizar que diga waiting for connections, que es la señal que el servicio está corriendo adecuadamente. Una vez que el servidor este iniciado, ahora debemos abrir una nueva consola e ir nuevamente a la ruta de instalación de MongoDB, aquí ubicaremos el cliente el cual tiene como nombre mongo.exe, y al ejecutarlo inmediatamente buscará hacer conexión con nuestro servicio, esto lo podemos ver en la siguiente imagen.
En caso que decidamos ir por la versión en línea de la web oficial solo debemos acceder a la ruta try.mongodb.org y ahí nos encontraremos con una consola de MongoDB hecha en JavaScript, esto nos facilita nuestras tareas en casos donde no podemos hacer la instalación o simplemente para satisfacer nuestra curiosidad.
Entorno de pruebas – datos iniciales
Ya que tenemos nuestro manejador corriendo y podemos ingresar comandos, necesitamos una cantidad de datos de prueba que nos permitan evaluar las consultas, para iniciar les dejamos los siguientes registros que pueden copiar y pegar en su consola para que tengan algo dentro de la Base de Datos y así obtener resultados con los ejemplos que vienen posteriormente:
db.guiamongo.insert({"nombre": "Maria", "edad":"25", "genero":"Femenino", "pais":"Colombia" });db.guiamongo.insert({"nombre": "Pedro", "edad":"32", "genero":"Masculino", "pais":"Ecuador" });db.guiamongo.insert({"nombre": "Ramon", "edad":"18", "genero":"Masculino", "pais":"Honduras" });db.guiamongo.insert({"nombre": "John", "edad":"22", "genero":"Masculino", "pais":"Argentina" });db.guiamongo.insert({"nombre": "Rosa", "edad":"45", "genero":"Femenino", "pais":"Chile", "idiomas":["Esp", "Ing", "Fra"] });Una vez insertados nuestros datos, ya tenemos el entorno de pruebas totalmente listo.
Consultar con find()
La herramienta principal para realizar las consultas en MongoDB es find(), con este simple comando podremos lograr ubicar de forma efectiva los documentos que necesitemos, recordemos que los documentos serán similares a los registros en otros manejadores de Base de Datos.
La forma más sencilla para utilizar find() es pasarle un array con las propiedades del documento que deseamos consultar y una vez con eso se hará el retorno de todo lo que cumpla con la condición, en el siguiente ejemplo vamos a ubicar a los documentos donde “genero” sea “Femenino”, para ello podemos utilizar el siguiente comando:
db.guiamongo.find({“genero”:”Femenino”});El resultado de esta consulta debería ser algo como lo siguiente:
Vemos como efectivamente MongoDB nos retorna los dos registros que insertamos en nuestro entorno de pruebas.
Como podemos notar los documentos han venido completos y tal vez solo necesitemos un solo atributo, en esos casos debemos pasar un segundo array a find() para indicarle que es lo que necesitamos traer del mismo, por defecto también se incluirá la llave primaria _id aunque no se especifique, veamos el comando para consultar solo los nombres de la consulta anterior:
db.guiamongo.find({“genero”:”Femenino”}, {“nombre”:1});Veamos en la siguiente imagen como podemos visualizar el resultado donde obtuvimos solo esa propiedad de nuestro documento:
Límitaciones de find()
Como no existen relaciones entre documentos no podemos ejecutar lo que se denomina joins en otros manejadores de Bases de Datos, por lo que no podemos tener una tabla de catálogos y únicamente adicionar el código al documento primario.
Otra limitación es que no podemos buscar y hacer condiciones con elementos del mismo documento, por ejemplo comparar la “edad” con otro campo numérico del mismo documento. Si esto lo tenemos en cuenta pronto encontraremos formas adecuadas de tratar nuestros documentos en MongoDB.
Operadores de comparación
El hecho que trabajemos con arrays y emparejando los mismos con las propiedades no implica que no podamos hacer comparaciones como mayor que, menor que, mayor o igual que, menor o igual que; sabemos que estas comparaciones son vitales en muchos sistemas que trabajan con consultas, es por ello que en MongoDB existen unos operadores especiales para estos casos, veamos cuales son:
Veamos a continuación como podemos emplear estas herramientas dentro de find() con un pequeño ejemplo.
En primer lugar vamos a consultar todos los documentos cuya edad sea menor a 25 años. Para ello colocaremos la edad y luego le pasaremos un array con la condición a evaluar cómo podemos notar en el siguiente comando:
db.guiamongo.find({"edad":{"$lt":"25"}});Esto nos dará como resultado lo siguiente:
Como vemos la consulta es muy sencilla y la podemos adecuar con lo que vimos anteriormente, de seleccionar que campos o propiedades del documento debe mostrarse, esto queda como ejercicio para que lo realicen.
Algo muy interesante es que podemos encadenar varias condiciones en la misma línea, con ello logramos una consulta mucho más específica, así obteniendo los resultados que de verdad necesitamos, por ejemplo digamos que necesitamos todos los mayores de 20 años pero menores de 30, para ello con el siguiente comando bastaría:
db.guiamongo.find({"edad":{"$gt":"20","$lt":"30"}});Esto nos debe generar un resultado similar a la siguiente imagen:
El operador $not
En ocasiones necesitamos consultar pero a su vez queremos que un valor o una serie de valores específicos no aparezcan, para ello tenemos el operador de negación $not, este puede aplicarse a cualquier condicional, y con ello los documentos que correspondan al criterio no aparecerán.
Por ejemplo vamos a reescribir el ejemplo anterior, donde en vez de ubicar el segmento mayor de 20 y menor de 30 vamos a excluirlos, para ello simplemente modificamos nuestro comando de la siguiente forma:
db.guiamongo.find({"edad": "$not":{"$gt":"20","$lt":"30"}}});Esto nos genera el siguiente resultado:
Como vemos hemos obtenido lo opuesto a lo que colocamos en las condiciones de comparación.
El operador $in
El operador $in funciona como la cláusula OR del lenguaje SQL tradicional, lo que nos permite obtener es simplemente los documentos que correspondan con una u otra de las condiciones que le pasemos.
Por ejemplo, vamos a buscar a las personas que sean de Chile o Argentina, en nuestros datos de pruebas tenemos dos registros que cumplen este criterio.
db.guiamongo.find({"pais":{"$in": ["Chile", "Argentina"]}});Al visualizar el resultado por consola tendremos que conseguimos lo esperado.
Con esto hemos finalizado este tutorial, ya tenemos una guía básica para realizar consultas contra nuestras Bases de Datos hechas en MongoDB, esto es muy importante saberlo ya que las Bases de Datos no relacionales o noSQL como se les conoce, también son la tendencia y el futuro del almacenamiento para las aplicaciones.