mis primeros pasos con mongodb utilizando nodejs

8

Click here to load reader

Upload: marcelo-alejandro-farias-torres

Post on 16-Dec-2015

6 views

Category:

Documents


1 download

DESCRIPTION

Manual de MongoDB con Node.js

TRANSCRIPT

  • Mis Ideas

    Internet, Desarrollo y Televisin

    PUBLICADO POR

    CARLOSSANCHEZPEREZ

    PUBLICADO EL

    AGOSTO 19, 2013

    PUBLICADO BAJO

    DESARROLLO DE SOFTWARE

    COMENTARIOS

    6 COMENTARIOS

    Mis primeros pasos con MongoDButilizando NodeJS

    iRate This

    (http://www.flickr.com/photos/sooey/5745780202/)He comenzado a montar un entorno de desarrollocon la base de datos NoSQL Mongodb (http://docs.mongodb.org/manual/) y utilizar tambin NodeJS(http://nodejs.org/) para ver su funcionamiento, la verdad es que llevaba tiempo detrs de ambos temas

    y ha llegado el momento de hacerlo y llevarlo a la prctica. La verdad es que el entorno de instalacintanto de MongoDB como de NodeJS, no es nada complicado en Linux, si lo intentas en otros sistemasoperativos, encontrars mucha informacin de cmo poder instalarlo o en la pgina oficial de

  • MongoBD (http://www.mongodb.org/downloads)tambin dispones de todos los sistemas operativos

    que lo puedes instalar.

    Vemos los primeros pasos de cmo podemosfamiliarizarnos con MongoDB y la shell quedispone para entender algunos comandos necesarios.

    Primero debemos arrancar desde el directorio bin elservidor de mongo : ./mongod en la que nos aparecelos datos como:

    MongoDB starting : pid=5982 port=27017

    dbpath=/data/db/ 64-bit host=desarrollo

    Ahora ya estamos en predisposicin de poder entraren la shell y ejecutar comandos con ./mongo .Veamos algunos de esos comandos interesantes de

    saber:

    Con el comando show dbs vemos todas las bases de datos creadas, as sabemos cuales son las quetenemos creadas y ponerlas en uso o activas con el comando use y el nombre de la base de datos, usecurses por ejemplo. Pero puedes estar pensando si utilizas bases de datos relacionales, Cmo me creouna base de datos?, en este caso es muy sencillo con el mismo comando use si existe la activa y si no

    existe la crea y la pone activa.

    Cuando hablamos de collections en MongoDB, estamos hablando en equivalencia a una tabla deRDBMS, por tanto una collection es, una agrupacin de documentos MongoDB. Una coleccin existedentro de una sola base de datos, pero no aplican un esquema propiamente dicho. Los documentos deuna coleccin pueden tener diferentes campos y por lo general, todos los documentos de una coleccintienen un propsito similar. Cuando hacemos mencin a un documento, nos estamos refiriendo a unregistro en una coleccin MongoDB y la unidad bsica de datos. Los documentos podramos decir

    que son algo as como los anlogos a los objetos JSON, pero existen en la base de datos en un formatoBSON, que viene a ser un formato de serializacin que se utiliza para almacenar los documentos yhacer llamadas a procedimientos remotos en MongoDB. BSON siginifca binary y JSON yBSON es una representacin de documentos JSON. Si quieres ampliar ms informacin te dejo esteenlace a la pgina oficial (http://bsonspec.org/).

    cmo podemos crearnos una coleccin con objetos?

    En principio vamos a crearnos algo sencillo, para ver con ms claridad dicha creacin y despusveremos algunas estructuras algo ms complejas. Si seguimos en la misma shell de MongoDB,

    debemos ejecutar el comando:

    db.things.insert({a : 1, b : 2}) ====> things es un collection y los que tenemos en {a : 1, b :2} es un objeto de pares de clave valor. Fjate bien en la nomenclatura, que es muy importante nocometer errores, cada elemento de pares y valores, se determina por clave : valor como a: 1 otype : sportetc. Cuando tenemos varios el separador es una coma ,.

  • Ahora veamos, cmo podramos hacer una llamada Asynchronous o Synchronous desde NodeIS ydesde MongoDB:

    1) Desde MongoDB tenemos preparado un script para poder hacer una bsqueda de de nuestrocollect things de una forma synchronous

    // Find one document in our collection

    var doc = db.things.findOne();

    // Print the resultprintjson(doc);

    2) si lo ejecutamos como una aplicacin NodeJS lo haremos de forma asynchronous, tal como lohemos montado:

    var MongoClient = require(mongodb).MongoClient;

    MongoClient.connect(mongodb://127.0.0.1:27017/csp, function(err, db) {

    if(err) throw err;

    // Find one document in our collection

    db.collection(things).findOne({}, function(err, doc) {

    // Print the resultconsole.dir(doc);

    // Close the DBdb.close();

    });

    // Declare successconsole.dir(Called findOne!);});

    La ejecucin de ambos casos lo haramos de la forma siguiente;

    # Run mongo shell examplemongo script.js

    # Run node.js example

    node app.js

    Seguro que se ta ha pasado por la mente, la diferencia entre hacer un find() o un findOne(), pues te lo

    muestro y vers por ti mismo la diferencia:

    > db.getCollection(things).find() -> Nos devuelve todos

  • > db.getCollection(things).find() -> Nos devuelve todos

    { _id : ObjectId(520d2ee81a813b88ff0bb905), a : 1, b : 2 }{ _id : ObjectId(520d36271a813b88ff0bb906), c : 3, d : 4 }

    { _id : ObjectId(520d36491a813b88ff0bb907), e : 5, f : 6 }> db.getCollection(things).findOne() -> nos devuelve nicamente el primero

    { _id : ObjectId(520d2ee81a813b88ff0bb905), a : 1, b : 2 }

    o tambin podramos hacerlo haciendo:

    > db.things.findOne()

    { _id : ObjectId(520d2ee81a813b88ff0bb905), a : 1, b : 2 }

    Un planteamiento sano que deberamos realizar es cundo debo utilizar una NoSQL, en nuestro

    caso MongoDB? pensemos lo siguiente. Imagina que tenemos un Blog en el que disponemos de variastablas relacionales en MySQL por ejemplo, tenemos una tabla de post, otra de comentarios, otra de

    autores de los post y adems los tags, los post tags y los post comments para relacionar los post ylos tags. Ya puedes hacerte una idea, que nuestro schema de base de datos, estar compuesto de seis

    tablas, por lo que si queremos hacer una consulta, por ejemplo, todos los posts con los comentarios y lostags asociados, necesitaremos que estn implicadas 6 tablas, verdad?

    Pues veamos ahora cmo podemos modelar este blog de tablas relacionales a MongoDB y cmo

    quedara nuestro schema. Necesitamos dos collections uno para alojar toda la informacin de los post

    y otra collections de autores, Vemos como sera:

    post { title: My first tirle, author : Carlos Snchez Prez , date : 19/08/2013, comments : [{name: "Antonio Lpez", comment : "my comment" }, { .... } ], tags : ["tag1","tag2","tag3"]}

    autor { _id : Carlos Snchez Prez , password; ,.. }

    Por tanto, las 6 tablas que antes implicbamos para ver toda la informacin, en el caso de nuestro

    schema de MongoDB, nicamente necesitamos una collections, post, para ver la misma informacin.Entendemos que no siempre es tan fcil el poder determinar que necesidad tenemos y en este caso

    decidimos eficacia y rapidez. Si quieres ampliar algo ms de informacin, te dejo un post que escrib

    hace tiempo sobre Bases de Datos: RDBMS vs No-SQL(http://carlossanchezperez.wordpress.com/2011/02/14/bases-de-datos-rdbms-vs-no-sql-una-r-

    evolucion/). Seguiremos hablando en prximos post.

    Desarrollo del Software (http://carlossanchezperez.wordpress.com/tag/desarrollo-del-software/)MongoDB (http://carlossanchezperez.wordpress.com/tag/mongodb/)

    NodeJS (http://carlossanchezperez.wordpress.com/tag/nodejs/)

    NoSQL (http://carlossanchezperez.wordpress.com/tag/nosql/)Programadores (http://carlossanchezperez.wordpress.com/tag/programadores/)

    About these ads (http://en.wordpress.com/about-these-ads/)

  • 6 comentarios en Mis primeros pasos con MongoDButilizando NodeJS

    1. Pingback: Algunos mtodos CRUD que son necesarios conocer con MongoDB | Mis Ideas

    2. jeansstyless dijo:

    noviembre 26, 2013 a las 4:38 pmSaludos Que tal

    Slo pas para preguntarteCmo relacionar la coleccin de Post con la de Autor?

    Estoy en medio de un projecto y consiste en crear un sistema de blogs

    Pero no sabra cmo tomar las dos colecciones y relacionarlasObservo cmo haces el ejemplo pero no s si en verdad cada usuario puede saber cuantos post

    ha hechoTe agradecera que me comentaras algo al respecto

    Que la pases bien (^_^)

    Responder

    carlossanchezperez dijo:

    noviembre 26, 2013 a las 6:19 pmHola, gracias por leer el post,

    pues yo te dira, sin saber mucho ms de tu proyecto, que a la hora de relacionar dos collections

    tengas en cuenta qu es lo que necesitas ofrecer de informacin y la frecuencia de acceso a lainformacin. Por ejemplo, si lo que necesitas es saber los posts de un usuario determinado, lo

    que necesitas relacionar es el nombre del usuario y hacerlo clave de autor. Por ejemplo, podras

    hacer:

    post {title: My first tirle,

    author : Carlos Snchez Prez ,date : 19/08/2013,

    comments : [ {name: "Antonio Lpez", comment : "my comment" }, { .... } ],tags : ["tag1","tag2","tag3"]

    .

    }

    autor { _id : Carlos Snchez Prez , password; ,.. }

    y si te fijas, la relacin de comentarios y tags de los post son, en este caso, one-to-few que encaja

  • y si te fijas, la relacin de comentarios y tags de los post son, en este caso, one-to-few que encaja

    muy bien, ya que un post no creo que tenga infinidad de comentarios y de tags, por tanto lodiseo mejor as ya que necesito mostrar toda la informacin del post y la necesito toda en una

    pantalla de consulta, no en distintos collections.

    Te aconsejo que le eches un vistazo a este otro post que podra ayudarte:

    http://carlossanchezperez.wordpress.com/2013/11/10/alguna-claves-a-la-hora-de-disenar-nuestros-datos-schema-design-con-mysql-vs-schema-design-con-mongodb/

    espero haber sido de ayuda, en cualquier caso ..pregunta!

    Responder

    3.

    jeansstyles dijo:noviembre 27, 2013 a las 1:20 am

    Saludos gracias por responderEs decir mi proyecto consiste en realizar un sistema de Blogs colavorativos

    Es decir, que un usuario cree un blog y luego tenga la opcin de agregar otros usuarios para quepuedan crear dicho blog.

    |Usuarios| |Blogs|

    O sea me imagino que la coleccin usuarios tiene su ID al crearse el Schema en MongoDB y lacoleccin Blogs posee su respectivo ID Yo crea que al relacionar las colecciones este ID encajara

    exactamente en ambas O mas bien en una base de datos relacional sera una nueva tabla, la dela relacin Crea que est entre Usuarios y Blogs

    |Usuarios| - - |Blogs|

    Para mi opinion, en bases de datos relacionales, la relacion Crea se llevara el ID tanto del usuariocon del blog, ya que sera una Muchos a Muchos (Porque el blog puede ser creado por variosusuarios)

    Pero creo que sera una especie de relacin ternaria ya que el usuario puede crear un blog y ungrupo que pueda tener control CRUD (Crear, Leer, Actualizar, Eliminar) del blog

    Estaba a punto de realizar la parte Cliente-Side con Backbone, pero me falta mucho paraaprenderlo a usar. As que decid crear todo con Jade Template ya que trabajar con Expressframework y con el mdulo de Mogoose

    A decir verdad me ayudara mucho que me facilitaras algo como lo siguiente:As se crean los Schemas, lo uso como el Modelo, del patrn Modelo Vista Controlador

    -

    usuario = new Schema{nombre: String,

  • apellido: String,},

    blogs = new Shcema{titulo: String,autor: String, // Aqui es donde tu mencionas que va el nombre del creador

    }

    //Luego la forma en que se relaciona ambas colecciones ya que cabe destacar que //ambas creanun ID diferente a cada data que se le inserte//En una base de datos relacional, se supone que van Llaver Forneas

    -

    Se supone que al tomar estos Schemas se crearan las colecciones pero lo que yo quiero es queactuen como si fuesen Relacionales

    A decir verdad tengo problemas para entender an el NoSQL, pero me han dicho que estasbases de datos se pueden relacionar aunque me informan que es complicado

    En fin si sabes algo te agradecera que me lo que comentarasQue la pases bien(^_^)

    Responder

    carlossanchezperez dijo:noviembre 27, 2013 a las 10:35 pm

    Yo te aconsejo que lo primero tengas claro, sea el modelo de tus datos y lo disees bien, no porser MongoDB o Mysql o la que quieras va ha ser mejor el proyecto tecnolgicamente hablando.Este tipo de decisiones harn que la arquitectura y rendimiento de tu proyecto afecte al cliente o

    usuario que est haciendo uso de tus servicios.

    Te recomiendo que leas ms sobre el tema y te informes si realmente necesitas una NoSQL ouna relacional. Mira tambin si existen ya soluciones open source.

    Responder4.

    jeansstyles dijo:noviembre 28, 2013 a las 11:27 pmSaludosA decir verdad para mi sera facil al decidir por una base de datos relacional

    Pero el proyecto por obligacin debo hacerlo en NoSQLExpress + Jade + MongoDB esa son las heramientas que debo tomar :/As que estuve leyendo el este post:

  • http://carlossanchezperez.wordpress.com/2013/11/10/alguna-claves-a-la-hora-de-disenar-nuestros-datos-schema-design-con-mysql-vs-schema-design-con-mongodb/

    Observ algo en el cual, incluas una coleccin dentro de otra

    var usuarios = new Schema({

    });

    var blog = new Schema({

    titulo: String,cuerpo: String,comentarios: [com1, com2, ..., comN],

    autores: [usuarios] //Esta es la coleccin usuario});

    Mas o menos as pero no s si me funcione bien as

    Responder

    Crea un blog o un sitio web gratuitos con WordPress.com. | El tema Zoren.

    Seguir

    Seguir Mis Ideas

    Ofrecido por WordPress.com