RSS Feed

Buenos amigos: NodeJS + MongoDB

25

agosto 13, 2012 by - @pjnovas

El intento de este post no es explicar qué es y cómo funciona MongoDB sino como utilizar una base con NodeJS.

Para lo referido a MongoDB, descubrí un librito excelente, corto y conciso en la jsConfAR: The Little MongoDB Book by Karl Seguin, lo interesante del libro es que está hecho en markdown y publicado en github con una versión al español traducida por @uokesita.

Me tomé el trabajito de pasar el markdown español a varias versiones para que lo puedas leer online, en algún dispositivo movil o en el kindle:


Instalando y configurando un Server Mongo

Mi prueba la hice en Ubuntu, pero no varia mucho para otras distribuciones/ SOs, podés ver las instrucciones para otros en: Quickstart – Installation Guides.

Descargamos la versión estable de MongoDB desde el sitio oficial de descargas

Después que termina toda la descarga, descomprimimos y navegamos hasta la carpeta bin de adentro y creamos un archivo mongodb.config donde le configuramos el path a donde van a ir las bases de datos (en mi caso de linux) agregándole la siguiente linea:

dbpath=/home/[usuario]/mongodb/data

Para windows podría ser:

dbpath=c:\mongodb\data

Asegurate de que el path exista y sino crealo (yo tuve que crear el directorio data)

Y ahora (parados en el bin) iniciamos el servidor con el path al mongodb.config:

./mongod --config mongodb.config

mongod es el proceso de servidor y mongo el cliente.

En ese momento vamos a ver que inicia el server y queda en espera en un puerto, en mi caso el 27017 (que es el default de Mongo)

MongoDB starting : pid=22105 port=27017 dbpath=/data/db/ 32-bit host=miUbuntu

Listo!, ya tenemos el server corriendo. Ahora abrimos otro terminal y ejecutemos el cliente mongo y un db.version() para probar:

$ ./mongo
> db.version()

Bueno, ya tenemos todo listo, podemos crear una colección y un documento:

use unTestDB
db.personas.insert({nombre: 'pepe', apellido: 'gonzales'})
db.personas.find()

{ "_id" : ObjectId("4fbaf11c7b25b9eac0403c26"), "nombre" : "pepe", "apellido" : "gonzales" }

El cliente lo iniciamos para crear una base de prueba, ya podemos matar el proceso mongo si molesta.
No mates el mongod que es el server!


Conectando a MongoDB desde NodeJS

Primero necesitamos un driver para node, y ahora se pone fácil:

npm install mongodb

El packete de NPM mongodb es un driver para NodeJS como también hay otras bibliotecas que vienen con algunas cosas interesantes como Mongoose, o MongoJS, pero no es nuestro caso ahora.

Creamos un app.js donde vamos a hacer una prueba contra la base unTestDB que creamos antes:

// hacemos referencia a la dependencia 
var mongodb = require('mongodb');

// obtenemos el server MongoDB que dejamos corriendo
// *** el puerto 27017 es el default de MongoDB
var server = new mongodb.Server("127.0.0.1", 27017, {});

// obtenemos la base de datos de prueba que creamos
var dbTest = new mongodb.Db('unTestDB', server, {})

// abrimos la base pasando el callback para cuando esté lista para usar
dbTest.open(function (error, client) {
  if (error) throw error;

  //en el parámetro client recibimos el cliente para comenzar a hacer llamadas
  //este parámetro sería lo mismo que hicimos por consola al llamar a mongo
  
  //Obtenemos la coleccion personas que creamos antes
  var collection = new mongodb.Collection(client, 'personas');
  
  //disparamos un query buscando la persona que habiamos insertado por consola
  collection.find({'nombre': 'pepe'}).toArray(function(err, docs) {

    //imprimimos en la consola el resultado
    console.dir(docs);
  });
});

Lo que nos queda es correr el app.js y ver el output en la consola

$ node app.js
[ { _id: 4fbaf11c7b25b9eac0403c26,
    nombre: 'pepe',
    apellido: 'gonzales' } ]

Y eso es todo!.

De nuevo, el objetivo del post es que veas lo simple que es engancharse desde NodeJS a un MongoDB, la parte de estudio (si nunca usaste Mongo) está más del lado de qué es y cómo funciona Mongo, el libro que está al inicio del post es un arranque muy bueno.

Links útiles

Algunos drivers y bibliotecas

Lista completa de Bibliotecas para MongoDB en NodeJS


  • http://www.facebook.com/ezequiel.sculli Ezequiel Sculli

    Muy bueno el post! Sería muy útil también un post relacionado a que particularidades existen cuando la aplicación NodeJS + MongoDB corre por ej, en Heroku, o en otras plataformas similares (configuración, plugin recomendados, etc).
    Un abrazo!

  • Sebastián Cámara

    LA PUTA QUE VALE LA PENA ESTAR VIVO
    Un saludo.

  • http://www.facebook.com/nacho1593 Ignacio Alonso Poblete Navarro

    hola amigo tengo un problema, hice seguí tus pasos (excepto que tengo mongo en la nube) pro le di la conexión pero me tira un error al momento de poner “var mongodb = require(‘mongodb’); ” a que se refiere eso? (cuando puese “npm install mongodb” me creo una carpeta que se llama mongodb eso hace referencia a esa carpeta?

    • pjnovas

      Hola Ignacio, que error te tira?,
      Cuando haces npm install mongodb, te va a crear una carpeta node_modules/mongodb ahi vas a tener la biblioteca mongodb a la que haces referencia cuando escribis var mongodb = require(‘mongodb’);
      Fijate que tu archivo js esté afuera de la carpeta node_modules, y que realmente tengas esa carpeta.
      Saludos

      • http://www.facebook.com/nacho1593 Ignacio Alonso Poblete Navarro

        hola mira me tira el error que no encuentra la referencia “requiere”, si me fije y tento la carpeta node_modules y dentro de esa carpeta esta la carpeta mongodb, ahora una duda el archivo xx.js como sabe la referencia a mongodb?? debe estar en la misma carpeta o en cualquier otro lugar??. Gracias

        • pjnovas

          Cuál de estos errores es?
          1. ” ReferenceError: requiere is not defined ”
          2. ” ReferenceError: require is not defined ”
          3. ” Error: Cannot find module ‘mongodb’ ”

          1: Asegurate de escribir “require”, no “requiere”.

          2: Te funciona con otro paquete o un módulo core, te funciona esto?:
          var http = require(‘http’);

          3: Tu estructura de archivos debería ser, dentro de tu carpeta del proyecto:
          proyecto/
          – app.js
          – node_modules/
          – — mongodb/

          y .. desde la consola ejecutas:
          node app.js

          Si instalas con npm install mongodb, la referencia la toma buscando en una carpeta al mismo nivel (del archivo que corres con node) que se llame node_modules y adentro de esa mongodb.
          Si instalas con npm install -g mongodb, pasa a ser global, y busca la carpeta node_modules dependiendo de varias cosas, como SO que tengas, donde tenes node, npm, etc. Pero lo importante del global es que queda global a todos tus proyectos/ archivos.js que tengas “en la pc” (por así decirlo)

          Si nada de lo anterior te soluciona el problema, copia y pega acá el error que tira en la consola, la estructura de archivos que tenes y que estas ejecutando en la consola.

          Saludos!

          • http://www.facebook.com/nacho1593 Ignacio Alonso Poblete Navarro

            aaa ok, mira lo ejecute desde la consola ( dentro de la carpeta …/nodejs , esta la carpeta node_modules y el xx.js) y me dice que tengo un error de conexion (ese problema debe ser de la conexion que me da mongohq.com) y desde el navegador probe el var http = requiere(‘http’) (tambien probe como esta en el tutorial y lo mismo) y me dice el error 2 que pusiste. Y la ultima duda, osea cuando vaya a crear una pagina en html conectandola con mongo (nodejs) mi estructura deveria ser:

            /carpetax
            -app.js
            -node_modules (copio la carpeta que me crea al ejecutar “npm install mongodb” con todo su contenido)
            -index.html

            Gracias y saludos

          • pjnovas

            Ahh!, ya entendí el problema, estas corriendo app.js desde un navegador!, esto va del lado del servidor, una página .html es cliente, contenido estático.
            Nada de lo que está acá (en este post y mis respuestas) va en un navegador, app.js lo ejecutas corriendo
            node app.js desde la consola de tu Sistema Operativo (no del navegador).

            No lo corras en un navegador porque no sabe lo que es “require”, eso lo sabe NodeJS.
            Una página html no se va a conectar con mongo, tu servidor (que tambien es js, pero no el mismo) se va a conectar con mongo y va a servir una pagina web al cliente.

            Te propongo que te olvides del navegador por ahora y te pases por http://fernetjs.com/nodejs/ donde por medio de posts explico como funciona toda esta locura de NodeJS, pero arrancá desde el primer post que explica la diferencia entre javascript en el cliente vs en NodeJS.

            Saludos!

          • http://www.facebook.com/nacho1593 Ignacio Alonso Poblete Navarro

            muchas gracias por tu ayuda, ya me funciono probando en localhost y entendi como funcióna, por casulidad has probado conectarlo con mongohq?? ( http://www.mongoqh.com) es un servidor con mongo gratuito. Saludos

          • pjnovas

            Genial!, de nada.
            Si, estuve jugando con mongohq y nodejitsu, es casi lo mismo, pero para el enganche utilicé MongoJS (el link está en el post), voy a ver de armar un post de eso, es un buen tema ;)Saludos!

          • http://www.facebook.com/nacho1593 Ignacio Alonso Poblete Navarro

            ok muchas gracias y buen post

  • http://twitter.com/AlejoNext Alejandro Ñext

    Es mejor utilizar mongoose, se pueden construir relaciones entre colecciones y generar Querys mas avanzados!

    • pjnovas

      Alejandro, el intento del post es mostrar una introducción a Mongo con NodeJS utilizando el driver nativo de Mongo.

      No diría que Mongoose es mejor o peor, Mongoose es un ODM (Object to Document Mapping), entre otras cosas.

      En mi opinión, Mongoose no sirve para cualquier cosa, tengo un caso real en el que le doy uso al dinamismo de los atributos en los documentos de mongo y Mongoose no me serviría ya que requiere un mapeo de campos y corta con el hecho de que los documentos pueden tener campos dinámicos.

      Pero si, Mongoose está muy bueno eh!, registrate y hacete un post de Mongoose para los que no lo conocen ;)

      Saludos!

      • http://twitter.com/AlejoNext Alejandro Ñext

        Me interesa! bastante por que he acumulado una cantidad de conocimiento en NodeJs y en Js. Y quisiera compartirlo con todos!!

        • Camilo Alvarado Llano

          Me podria regalar su correo para colocarme en contacto con usted, soy nuevo en este mundo y me gustaria contar con su apoyo para salir adelante en este tema.Muchas gracias

          • Alejandro Ñext

            Agregame a tuitter @alejonext o +google Alejo Mext

  • Felipe Uribe

    Hola, gracias por el post, me da en la cabeza interactuar con funciones y objetos, mi duda es: como puedo acceder a “docs” desde fuera del objeto.

    Saludos

    • Diego Molina

      Hola sabes que tengo tu mismo problema, lo pudiste solucionar?? Gracias!

      • Felipe Uribe

        lo siento no recuerdo bien como lo hice y te confundiria mas darte detalle,lo que recuero es que era accediendo al array. pjnovas es un excelente administrador del blog y creo que el te podria explicar mejor que yo.
        un saludo.

    • pjnovas

      Buenas Felipe, no entiendo bien a que te referis con “acceder a los docs desde fuera de un objeto”.
      Saludos!

      • Felipe Uribe

        bueno a lo que me refería, es desde cualquier otro lugar del código acceder a cualquier elemento de ese array. bueno creo que mi problema estaba mas relacionado a como extraer datos del array.
        saludos

  • Camilo Alvarado Llano

    como puedo obtener todos los registros directamente y no obtener solo el que en este caso se llama pepe????

    • pjnovas

      db.personas.find() sin pasarle parametros te va a devolver toda la collection

  • Julio Alfredo

    hola he revisado el libro y no hay nada de como usar con nodjs , como dices en la intruccion

    • pjnovas

      Buenas Julio, el libro es sobre Mongo DB fuera del driver que vas a usar, te da una base de lo que es MongoDB. La explicación de como usarlo en NodeJS se encuentra en el post, no en el libro, perdón si no se entendió bien en la introducción. También podes ver los links al final del post donde tenes otras bibliotecas y links a los drivers para jugar con nodejs.

      También te recomiendo que veas MongooseJS en este post:
      http://fernetjs.com/2013/02/mongoose-nodejs-modelos-parte-1/