Está en la página 1de 8

Mis Ideas

Internet, Desarrollo y Televisión

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 también NodeJS
(http://nodejs.org/) para ver su funcionamiento, la verdad es que llevaba tiempo detrás de ambos temas
y ha llegado el momento de hacerlo y llevarlo a la práctica. La verdad es que el entorno de instalación
tanto de MongoDB como de NodeJS, no es nada complicado en Linux, si lo intentas en otros sistemas
operativos, encontrarás mucha información de cómo poder instalarlo o en la página oficial de
MongoBD (http://www.mongodb.org/downloads)
también dispones de todos los sistemas operativos
que lo puedes instalar.

Vemos los primeros pasos de cómo 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

Ahora ya estamos en predisposición de poder entrar


en 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 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, ¿Cómo 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 agrupación de documentos MongoDB. Una colección existe
dentro de una sola base de datos, pero no aplican un esquema propiamente dicho. Los documentos de
una colección pueden tener diferentes campos y por lo general, todos los documentos de una colección
tienen un propósito similar. Cuando hacemos mención a un documento, nos estamos refiriendo a un
registro en una colección MongoDB y la unidad básica de datos. Los documentos podríamos decir
que son algo así como los análogos a los objetos JSON, pero existen en la base de datos en un formato
BSON, que viene a ser un formato de serialización que se utiliza para almacenar los documentos y
hacer llamadas a procedimientos remotos en MongoDB. “BSON” siginifca “binary” y “JSON” y
BSON es una representación de documentos JSON. Si quieres ampliar más información te dejo este
enlace a la página oficial (http://bsonspec.org/).

¿cómo podemos crearnos una colección con objetos?

En principio vamos a crearnos algo sencillo, para ver con más claridad dicha creación y después
veremos algunas estructuras algo más 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. Fíjate 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” : “sport”…etc. Cuando tenemos varios el separador es una coma “,”.
Ahora veamos, cómo podríamos hacer una llamada Asynchronous o Synchronous desde NodeIS y
desde MongoDB:

1) Desde MongoDB tenemos preparado un script para poder hacer una búsqueda 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 aplicación 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 ejecución de ambos casos lo haríamos 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 verás 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 también podríamos hacerlo haciendo:

> db.things.findOne()
{ “_id” : ObjectId(“520d2ee81a813b88ff0bb905″), “a” : 1, “b” : 2 }

Un planteamiento sano que deberíamos realizar es ¿cuándo 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 además 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 estén implicadas 6 tablas, verdad?

Pues veamos ahora cómo podemos modelar este blog de tablas relacionales a MongoDB y cómo
quedaría nuestro schema. Necesitamos dos collections uno para alojar toda la información de los post
y otra collections de autores, Vemos como sería:

post { title: “My first tirle”, author : “Carlos Sánchez Pérez” , date : “19/08/2013″, comments : [
{name: "Antonio López", comment : "my comment" }, { .... } ], tags : ["tag1","tag2","tag3"]}

autor { _id : “Carlos Sánchez Pérez “, password; “”,…….. }

Por tanto, las 6 tablas que antes implicábamos para ver toda la información, en el caso de nuestro
schema de MongoDB, únicamente necesitamos una collections, post, para ver la misma información.
Entendemos que no siempre es tan fácil el poder determinar que necesidad tenemos y en este caso
decidimos eficacia y rapidez. Si quieres ampliar algo más de información, 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 próximos post.

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


About these ads (http://en.wordpress.com/about-
MongoDB (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 métodos CRUD que son necesarios conocer con MongoDB | Mis Ideas
2.
jeansstyless dijo:
noviembre 26, 2013 a las 4:38 pm
Saludos… Que tal…
Sólo pasé para preguntarte…
¿Cómo relacionar la colección de Post con la de Autor…?
Estoy en medio de un projecto… y consiste en crear un sistema de blogs…
Pero no sabría cómo tomar las dos colecciones y relacionarlas…
Observo cómo haces el ejemplo… pero… no sé si en verdad cada usuario puede saber cuantos post
ha hecho…
Te agradecería 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 diría, sin saber mucho más de tu proyecto, que a la hora de relacionar dos collections
tengas en cuenta qué es lo que necesitas ofrecer de información y la frecuencia de acceso a la
información. 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, podrías
hacer:

post {
title: “My first tirle”,
author : “Carlos Sánchez Pérez” ,
date : “19/08/2013″,
comments : [ {name: "Antonio López", comment : "my comment" }, { .... } ],
tags : ["tag1","tag2","tag3"]
………….
}

autor { _id : “Carlos Sánchez Pérez “, password; “”,…….. }

y si te fijas, la relación de comentarios y tags de los post son, en este caso, one-to-few que encaja
y si te fijas, la relación 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
diseño mejor así ya que necesito mostrar toda la información 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 podría 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 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 opción de agregar otros usuarios para que
puedan crear dicho blog….

|Usuarios| —— |Blogs|…

O sea… me imagino que la colección usuarios tiene su ID al crearse el Schema en MongoDB y la


colección Blogs posee su respectivo ID… Yo creía que al relacionar las colecciones este ID encajaría
exactamente en ambas… O mas bien… en una base de datos relacional sería una nueva tabla, la de
la relación “Crea” que está entre Usuarios y Blogs…

|Usuarios| —- <> —- |Blogs|…

Para mi opinion, en bases de datos relacionales, la relacion “Crea” se llevaría el ID tanto del usuario
con del blog, ya que sería una Muchos a Muchos (Porque el blog puede ser creado por varios
usuarios…)…

Pero creo que sería una especie de relación 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 módulo de Mogoose…

A decir verdad… me ayudaría mucho que me facilitaras algo como lo siguiente…:


Así se crean los Schemas, lo uso como el Modelo, del patrón 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 Foráneas…”…

———————————————————————————————-

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 aún 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 agradecería 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 diseñes bien, no por
ser MongoDB o Mysql o la que quieras va ha ser mejor el proyecto tecnológicamente hablando.
Este tipo de decisiones harán que la arquitectura y rendimiento de tu proyecto afecte al cliente o
usuario que está haciendo uso de tus servicios.

Te recomiendo que leas más sobre el tema y te informes si realmente necesitas una NoSQL o
una relacional. Mira también si existen ya soluciones open source.

Responder
4.
jeansstyles dijo:
noviembre 28, 2013 a las 11:27 pm
Saludos…
A decir verdad… para mi sería facil al decidir por una base de datos relacional…
Pero el proyecto por obligación 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-nuestros-
datos-schema-design-con-mysql-vs-schema-design-con-mongodb/

Observé algo en el cual, incluías una colección dentro de otra…

var usuarios = new Schema({



});

var blog = new Schema({


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

autores: [usuarios] //Esta es la colección “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

También podría gustarte