You are on page 1of 8

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 MongoDB


utilizando NodeJS

i
Rate This
(http://www.flickr.com/photos/sooey/5745780202/)He comenzado a montar un entorno de desarrollo
con 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 instalacin
tanto de MongoDB como de NodeJS, no es nada complicado en Linux, si lo intentas en otros sistemas
operativos, 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 podemos
familiarizarnos con MongoDB y la shell que
dispone para entender algunos comandos necesarios.
Primero debemos arrancar desde el directorio bin el
servidor de mongo : ./mongod en la que nos aparece
los datos como:
MongoDB starting : pid=5982 port=27017
dbpath=/data/db/ 64-bit host=desarrollo

saber:

Ahora ya estamos en predisposicin de poder entrar


en la shell y ejecutar comandos con ./mongo .
Veamos algunos de esos comandos interesantes de

Con el comando show dbs vemos todas las bases de datos creadas, as sabemos cuales son las que
tenemos creadas y ponerlas en uso o activas con el comando use y el nombre de la base de datos, use
curses por ejemplo. Pero puedes estar pensando si utilizas bases de datos relacionales, Cmo me creo
una 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 de
RDBMS, por tanto una collection es, una agrupacin de documentos MongoDB. Una coleccin existe
dentro de una sola base de datos, pero no aplican un esquema propiamente dicho. Los documentos de
una coleccin pueden tener diferentes campos y por lo general, todos los documentos de una coleccin
tienen un propsito similar. Cuando hacemos mencin a un documento, nos estamos refiriendo a un
registro 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 formato
BSON, que viene a ser un formato de serializacin que se utiliza para almacenar los documentos y
hacer llamadas a procedimientos remotos en MongoDB. BSON siginifca binary y JSON y
BSON es una representacin de documentos JSON. Si quieres ampliar ms informacin te dejo este
enlace 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 despus
veremos 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 no
cometer errores, cada elemento de pares y valores, se determina por clave : valor como a: 1 o
type : sportetc. Cuando tenemos varios el separador es una coma ,.

Ahora veamos, cmo podramos hacer una llamada Asynchronous o Synchronous desde NodeIS y
desde MongoDB:
1) Desde MongoDB tenemos preparado un script para poder hacer una bsqueda de de nuestro
collect things de una forma synchronous
// Find one document in our collection
var doc = db.things.findOne();
// Print the result
printjson(doc);
2) si lo ejecutamos como una aplicacin NodeJS lo haremos de forma asynchronous, tal como lo
hemos 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 result
console.dir(doc);
// Close the DB
db.close();
});
// Declare success
console.dir(Called findOne!);
});
La ejecucin de ambos casos lo haramos de la forma siguiente;
# Run mongo shell example
mongo 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 varias
tablas 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 y
los 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 los
tags 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-revolucion/). Seguiremos hablando en prximos post.
Desarrollo del Software (http://carlossanchezperez.wordpress.com/tag/desarrollo-del-software/)
About these ads (http://en.wordpress.com/aboutMongoDB (http://carlossanchezperez.wordpress.com/tag/mongodb/)
these-ads/)
NodeJS (http://carlossanchezperez.wordpress.com/tag/nodejs/)
NoSQL (http://carlossanchezperez.wordpress.com/tag/nosql/)
Programadores (http://carlossanchezperez.wordpress.com/tag/programadores/)

6 comentarios en Mis primeros pasos con MongoDB


utilizando NodeJS
1. Pingback: Algunos mtodos CRUD que son necesarios conocer con MongoDB | Mis Ideas
2.
jeansstyless dijo:
noviembre 26, 2013 a las 4:38 pm
Saludos Que tal
Slo pas para preguntarte
Cmo 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 relacionarlas
Observo cmo haces el ejemplo pero no s si en verdad cada usuario puede saber cuantos post
ha hecho
Te agradecera que me comentaras algo al respecto
Que la pases bien (^_^)
Responder
carlossanchezperez dijo:
noviembre 26, 2013 a las 6:19 pm
Hola, 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 la
informacin. 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 lo
diseo 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-disenarnuestros-datos-schema-design-con-mysql-vs-schema-design-con-mongodb/
espero haber sido de ayuda, en cualquier caso ..pregunta!
3.

Responder
jeansstyles dijo:
noviembre 27, 2013 a las 1:20 am
Saludos gracias por responder
Es 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 que
puedan crear dicho blog.
|Usuarios| |Blogs|
O sea me imagino que la coleccin usuarios tiene su ID al crearse el Schema en MongoDB y la
coleccin 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 de
la 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 usuario
con del blog, ya que sera una Muchos a Muchos (Porque el blog puede ser creado por varios
usuarios)
Pero creo que sera una especie de relacin ternaria ya que el usuario puede crear un blog y un
grupo 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 para
aprenderlo a usar. As que decid crear todo con Jade Template ya que trabajar con Express
framework 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 crean
un 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 que
actuen como si fuesen Relacionales
A decir verdad tengo problemas para entender an el NoSQL, pero me han dicho que estas
bases de datos se pueden relacionar aunque me informan que es complicado
En fin si sabes algo te agradecera que me lo que comentaras
Que 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 por
ser 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 o
una relacional. Mira tambin si existen ya soluciones open source.
4.

Responder
jeansstyles dijo:
noviembre 28, 2013 a las 11:27 pm
Saludos
A decir verdad para mi sera facil al decidir por una base de datos relacional
Pero el proyecto por obligacin debo hacerlo en NoSQL
Express + 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-nuestrosdatos-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

You might also like