Revista Informática

MongoDB desde Cero: Operaciones Básicas

Publicado el 23 septiembre 2013 por Codehero @codeheroblog

Creación de registros - .insert()

Las operaciones son como funciones de Javascript, así que llamaremos al objeto base de datos db y crearemos una nueva propiedad o lo que se asemejaría al concepto de tabla con el nombre de autores y le asociaremos su valor correspondiente (un objeto autor), es decir, una colección con un documento asociado:

> db.autores.insert({ nombre : 'Jonathan', apellido : 'Wiesel', secciones : ['Como lo hago' , 'MongoDB'] });

12345 >dbautoresinsert({  nombre  :   'Jonathan',  apellido  :   'Wiesel',  secciones   :   ['Como lo hago','MongoDB']});

Los documentos se definen como los objetos Javascript, u objetos JSON.

Inclusive es posible declarar el documento como un objeto, almacenarlo en una variable y posteriormente insertarlo de la siguiente manera:

> var autorDelPost = { nombre : 'Jonathan', apellido : 'Wiesel', secciones : ['Como lo hago' , 'MongoDB'] }; > db.autores.insert(autorDelPost);

1234567 >varautorDelPost={  nombre  :'Jonathan',  apellido  :'Wiesel',  secciones   :['Como lo hago','MongoDB']}; >dbautoresinsert(autorDelPost);

Ahora si ejecutamos el comando show collections podremos ver que se encuentra nuestra nueva colección de autores:

autores ...

12 autores

Agreguemos un par de autores más:

> db.autores.insert({ nombre : 'Oscar', apellido : 'Gonzalez', secciones : ['iOS' , 'Objective C' , 'NodeJS' ], socialAdmin : true }); > db.autores.insert({ nombre : 'Alberto', apellido : 'Grespan', secciones : 'Git', genero : "M" });

123456789101112 >dbautoresinsert({  nombre  :   'Oscar',  apellido  :   'Gonzalez',  secciones   :   ['iOS','Objective C','NodeJS'],  socialAdmin:   true});>dbautoresinsert({  nombre  :   'Alberto',  apellido  :   'Grespan',  secciones   :   'Git',  genero  :   "M"});

Veamos que insertamos nuevos documentos en la colección de autores que tienen otra estructura, en MongoDB esto es completamente posible y es una de sus ventajas.


Búsqueda de registros - .find()

Hagamos un query o una busqueda de todos registros en la colección de autores.

> db.autores.find(); { "_id" : ObjectId("5232344a2ad290346881464a"), "nombre" : "Jonathan", "apellido" : "Wiesel", "secciones" : [ "Como lo hago", "Noticias" ] } { "_id" : ObjectId("523236022ad290346881464b"), "nombre" : "Oscar", "apellido" : "Gonzalez", "secciones" : [ "iOS", "Objective C", "NodeJS" ], "socialAdmin" : true } { "_id" : ObjectId("5232383a2ad290346881464c"), "nombre" : "Alberto", "apellido" : "Grespan", "secciones" : "Git", "genero" : "M" }

12345 >dbautoresfind(); {"_id":ObjectId("5232344a2ad290346881464a"),"nombre":"Jonathan","apellido":"Wiesel","secciones":[  "Como lo hago",  "Noticias"]}{"_id":ObjectId("523236022ad290346881464b"),"nombre":"Oscar","apellido":"Gonzalez","secciones":[  "iOS",  "Objective C",  "NodeJS"],"socialAdmin":true}{"_id":ObjectId("5232383a2ad290346881464c"),"nombre":"Alberto","apellido":"Grespan","secciones":"Git","genero":"M"}

Notemos que la búsqueda nos arroja los objetos resultantes, en este caso los documentos de los 3 autores que insertamos acompañados del identificador único que crea MongoDB, este campo _id se toma además como indice por defecto.

Si lo deseas puedes manualmente especificar el valor del campo _id cuando estas insertando los registros con el comando db.coleccion.insert(); sin embargo ten en cuenta que debes asegurar que este valor sea único, de lo contrario los registros con dicho campo duplicado resultarán en error por clave primaria duplicada.

Una búsqueda como la anterior sería similar en SQL a:

SELECT * FROM autores

Filtros

Digamos que ahora queremos hacer la búsqueda pero filtrada por los algún parámetro. Para esto sólo debemos pasar el filtro deseado a la función find(), busquemos a los administradores sociales para probar:

> db.autores.find({ socialAdmin: true }); { "_id" : ObjectId("523236022ad290346881464b"), "nombre" : "Oscar", "apellido" : "Gonzalez", "secciones" : [ "iOS", "Objective C", "NodeJS" ], "socialAdmin" : true }

123 >dbautoresfind({socialAdmin:true}); {"_id":ObjectId("523236022ad290346881464b"),"nombre":"Oscar","apellido":"Gonzalez","secciones":[  "iOS",  "Objective C",  "NodeJS"],"socialAdmin":true}

En SQL sería similar a:

SELECT * FROM autores WHERE socialAdmin = true

Probemos ahora filtrar por varias condiciones, primero probemos con filtros donde TODOS se deben cumplir:

> db.autores.find({ genero: 'M', secciones: 'Git' }); { "_id" : ObjectId("5232383a2ad290346881464c"), "nombre" : "Alberto", "apellido" : "Grespan", "secciones" : "Git", "genero" : "M" }

123 >dbautoresfind({genero:'M',secciones:'Git'}); {"_id":ObjectId("5232383a2ad290346881464c"),"nombre":"Alberto","apellido":"Grespan","secciones":"Git","genero":"M"}

Es importante destacar que si el documento resultante hubiese tenido en la propiedad secciones un arreglo en lugar de una cadena de caracteres, si dicho arreglo tuviese el valor Git también cumple la condición.

En SQL sería similar a:

SELECT * FROM autores WHERE genero = 'M' AND secciones = 'Git'

Veamos ahora un ejemplo un poco más avanzado de filtros con condiciones donde queremos que solo ALGUNA de ellas se cumpla:

> db.autores.find({ $or: [ {socialAdmin : true}, {genero: 'M'} ] }); { "_id" : ObjectId("523236022ad290346881464b"), "nombre" : "Oscar", "apellido" : "Gonzalez", "secciones" : [ "iOS", "Objective C", "NodeJS" ], "socialAdmin" : true } { "_id" : ObjectId("5232383a2ad290346881464c"), "nombre" : "Alberto", "apellido" : "Grespan", "secciones" : "Git", "genero" : "M" }

123456789 >dbautoresfind({  $or:[  {socialAdmin:true},  {genero:'M'}  ]}); {"_id":ObjectId("523236022ad290346881464b"),"nombre":"Oscar","apellido":"Gonzalez","secciones":[  "iOS",  "Objective C",  "NodeJS"],"socialAdmin":true}{"_id":ObjectId("5232383a2ad290346881464c"),"nombre":"Alberto","apellido":"Grespan","secciones":"Git","genero":"M"}

En este caso estamos filtrando por aquellos autores que son administradores sociales ó aquellos que tengan el campo género con el carácter M.

En SQL sería similar a:

SELECT * FROM autores WHERE socialAdmin = true OR genero = 'M'

Limitar y Ordenar

Si quisiéramos limitar los resultados a un número máximo especificado de registros es tan fácil como agregar .limit(#) al final del comando .find():

> db.autores.find().limit(1) { "_id" : ObjectId("5232344a2ad290346881464a"), "nombre" : "Jonathan", "apellido" : "Wiesel", "secciones" : [ "Como lo hago", "MongoDB" ] }

123 >dbautoresfind()limit(1) {"_id":ObjectId("5232344a2ad290346881464a"),"nombre":"Jonathan","apellido":"Wiesel",  "secciones":[  "Como lo hago",  "MongoDB"]}

En SQL sería similar a:

SELECT * FROM autores LIMIT 1

La misma modalidad sigue la funcionalidad de ordenar los registros por un campo en particular, el cual servirá de argumento a la función .sort():

> db.autores.find().sort({apellido : 1}) { "_id" : ObjectId("523236022ad290346881464b"), "nombre" : "Oscar", "apellido" : "Gonzalez", "secciones" : [ "iOS", "Objective C", "NodeJS" ], "socialAdmin" : true } { "_id" : ObjectId("5232383a2ad290346881464c"), "nombre" : "Alberto", "apellido" : "Grespan", "secciones" : "Git", "genero" : "M" } { "_id" : ObjectId("5232344a2ad290346881464a"), "nombre" : "Jonathan", "apellido" : "Wiesel", "secciones" : [ "Como lo hago", "MongoDB" ] }

12345 >dbautoresfind()sort({apellido:1}) {"_id":ObjectId("523236022ad290346881464b"),"nombre":"Oscar","apellido":"Gonzalez","secciones":[  "iOS",  "Objective C",  "NodeJS"],"socialAdmin":true}{"_id":ObjectId("5232383a2ad290346881464c"),"nombre":"Alberto","apellido":"Grespan","secciones":"Git","genero":"M"}{"_id":ObjectId("5232344a2ad290346881464a"),"nombre":"Jonathan","apellido":"Wiesel","secciones":[  "Como lo hago",  "MongoDB"]}

El número 1 que acompaña al argumento de ordenamiento es el tipo de orden, 1 para descendiente y -1 para ascendente

En SQL sería similar a:

SELECT * FROM autores ORDER BY apellido DESC

También podemos combinar ambas funciones tan solo llamando una después de otra:

> db.autores.find().sort({apellido : 1}).limit(1) { "_id" : ObjectId("523236022ad290346881464b"), "nombre" : "Oscar", "apellido" : "Gonzalez", "secciones" : [ "iOS", "Objective C", "NodeJS" ], "socialAdmin" : true }

123 >dbautoresfind()sort({apellido:1})limit(1) {"_id":ObjectId("523236022ad290346881464b"),"nombre":"Oscar","apellido":"Gonzalez","secciones":[  "iOS",  "Objective C",  "NodeJS"],"socialAdmin":true}

Otros filtros

Existen varios operadores más para filtrar las búsquedas; eso lo dejaremos para más adelante para no sobrecargarte de información tan rápido, pero no te preocupes que no lo pasaremos por alto.


Eliminación de registros - .remove() y .drop()

Si entendiste como buscar registros pues eliminarlos es igual de fácil. Para esto existen 4 posibilidades:

  • Eliminar los documentos de una colección que cumplan alguna condición.
  • Eliminar todos los documentos de una colección.
  • Eliminar la colección completa.

Probemos eliminandome a mí de la colección de autores:

> db.autores.remove({ nombre: 'Jonathan' });

1 >dbautoresremove({nombre:'Jonathan'});

En SQL sería similar a:

DELETE FROM autores WHERE nombre = 'Jonathan'

¿Fácil no?. Eliminemos ahora a los demás autores:

> db.autores.remove();

1 >dbautoresremove();

En SQL sería similar a:

DELETE FROM autores

Ahora que la colección ha quedado vacía deshagamonos de ella:

> db.autores.drop();

1 >dbautoresdrop();

En SQL sería similar a:

DROP TABLE autores


Conclusión

Seguramente te estarás preguntando: ¿Y qué pasó con los update?. La modificación de registros involucra múltiples maneras para que puedas manipular la información a tu gusto, por ello lo dejaremos para la próxima entrada, no desesperes. Estos son los primeros pasos a tomar para que comiences a usar MongoDB, todavía queda un largo camino por delante ya que hay mucho que aprender sobre esta magnifica solución de base de datos.


Volver a la Portada de Logo Paperblog