Está en la página 1de 9

UNIVERSIDAD DE TALCA

FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL EN BIOINFORMÁTICA

Bases de Datos Avanzadas


Unidad I
MongoDB

MongoDB1 es una base de datos open-source NoSQL orientado a documentos. En vez de guardar los
datos en tablas como se hace en las base de datos relacionales, MongoDB guarda estructuras de datos en
documentos tipo JSON con un esquema dinámico (MongoDB llama ese formato BSON), haciendo que la
integración de los datos en ciertas aplicaciones sea más fácil y rápida2 .

MongoDB dispone de un campo id de tipo ObjectId. Este objeto está especialmente pensado para
garantizar unicidad en entornos distribuidos como MongoDB. El campo está compuesto por 12 bytes. Los
cuatro primeros bytes son un timestamp con los segundos desde el epoch de Unix; los tres siguientes bytes
representan el identificador único de la máquina; los dos siguientes el identificador del proceso; y para finalizar
los últimos tres bytes, son un campo incremental (Ver figura 1).

Figura 1: Campo id para identificar de forma única los elementos.

Una de las diferencias más importantes con respecto a las bases de datos relacionales, es que no es
necesario seguir un esquema. Los documentos de una misma colección – concepto similar a una tabla de
una base de datos relacional -, pueden tener esquemas diferentes.

MongoDB está escrito en C++, aunque las consultas se hacen pasando objetos JSON como parámetro.

Aunque se suele decir que las bases de datos NoSQL tienen un ámbito de aplicación reducido, MongoDB
se puede utilizar en muchos de los proyectos que desarrollamos en la actualidad.

Cualquier aplicación que necesite almacenar datos semi estructurados puede usar MongoDB. Es el caso
de las tı́picas aplicaciones CRUD o de muchos de los desarrollos web actuales.

Eso sı́, aunque las colecciones de MongoDB no necesitan definir une esquema, es importante que diseñemos
nuestra aplicación para seguir uno. Tendremos que pensar si necesitamos normalizar los datos, desnormalizar-
los o utilizar una aproximación hı́brida. Estas decisiones pueden afectar al rendimiento de nuestra aplicación.
En definitiva el esquema lo definen las consultas que vayamos a realizar con más frecuencia.

MongoDB es especialmente útil en entornos que requieran escalabilidad. Con sus opciones de replicación y
1 https://www.mongodb.org/
2 https://es.wikipedia.org/wiki/MongoDB

1
sharding (partición de una gran base de datos en partes más pequeñas), que son muy sencillas de configurar,
podemos conseguir un sistema que escale horizontalmente sin demasiados problemas.

En esta base de datos no existen las transacciones. Aunque nuestra aplicación puede utilizar algu-
na técnica para simular las transacciones, MongoDB no tiene esta capacidad. Solo garantiza operaciones
atómicas a nivel de documento. Si las transacciones son algo indispensable en nuestro desarrollo, deberemos
pensar en otro sistema.

Tampoco existen los JOINS. Para consultar datos relacionados en dos o más colecciones, tenemos que
hacer más de una consulta. En general, si nuestros datos pueden ser estructurados en tablas, y necesitamos
las relaciones, es mejor que optemos por un RDBMS clásico.

Actividad

Realice los pasos que a continuación se detallan para la instalación, puesta en marcha y pruebas de
MongoDB.

Genere un informe que demuestre el desarrollo de esta actividad. Puede utilizar screenshots (comentando
lo que se muestra en cada uno de ellos). Si encuentra algún problema en el desarrollo de la actividad, describa
tal situación y como la resolvió.

1. Instalación

Basado en el sitio Getting Started with MongoDB (MongoDB Shell Edition)3

Como usuario root :

# apt-get install mongodb mongodb-clients mongodb-server mongodb-server-core mongo-tools

Uso (como usuario root ):


/etc/init.d/mongodb start|stop|force-stop|restart|force-reload|status

# /etc/init.d/mongodb start
[ ok ] Starting mongodb (via systemctl): mongodb.service.

# /etc/init.d/mongodb stop
[ ok ] Stopping mongodb (via systemctl): mongodb.service.

3 http://docs.mongodb.org/getting-started/shell/

2
2. Importando datos

El ejemplo utiliza la collection restaurants en la base de datos test. El siguiente es un ejemplo de


document en la collection restaurants.

{
"address": {
"building": "1007",
"coord": [ -73.856077, 40.848447 ],
"street": "Morris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Morris Park Bake Shop",
"restaurant_id": "30075445"
}

Debe estar ejecutando el servicio mongodb antes de importar los datos.

Descargue el set de datos desde Educandus y renombre el archivo a primer-dataset.json.

En la terminal ejecutamos el comando mongoimport para insertar los datos en la base de datos.

$ mongoimport --db test --collection restaurants --drop --file primer-dataset.json

connected to: 127.0.0.1


Wed Jun 24 15:41:19.985 dropping: test.restaurants
Wed Jun 24 15:41:21.935 check 9 25359
Wed Jun 24 15:41:22.143 imported 25359 objects

Para conectar a un servidor no local puede incluir en el comando las instrucciones –host y –port

3
3. MongoDB Shell (mongo)

Mongo Shell es una interface en JavaScript interactiva a MongoDB. Se utiliza para consultar y actualizar
datos como para realizar operaciones administrativas.

Para ejecutar mongo, desde la terminal ejecutar:

$ mongo
MongoDB shell version: 2.4.14
connecting to: test
>

> show dbs


local 0.078125GB
test 0.203125GB

> use test


switched to db test

> show collections


restaurants
system.indexes

Para mostrar ayuda ejecutar la instrucción help en la shell.

4
3.1. Insertar datos

$ mongo
MongoDB shell version: 2.4.14
connecting to: test
> use test
switched to db test
> db.restaurants.insert(
... {
... "address" : {
... "street" : "2 Avenue",
... "zipcode" : "10075",
... "building" : "1480",
... "coord" : [ -73.9557413, 40.7720266 ],
... },
... "borough" : "Manhattan",
... "cuisine" : "Italian",
... "grades" : [
... {
... "date" : ISODate("2014-10-01T00:00:00Z"),
... "grade" : "A",
... "score" : 11
... },
... {
... "date" : ISODate("2014-01-16T00:00:00Z"),
... "grade" : "B",
... "score" : 17
... }
... ],
... "name" : "Vella",
... "restaurant_id" : "41704620"
... }
... )

3.2. Consultar datos

Para retornar todos los documentos en una colección se utiliza el métido find() sin ningún criterio de
filtrado. El siguiente ejemplo obtiene todos documentos de la colección restaurants.

> db.restaurants.find()

{ "_id" : ObjectId("558afebcac4eb6ce33c2f648"), "address" : { "building" : "1007",


"coord" : [ -73.856077, 40.848447 ], "street" : "Morris Park Ave",
"zipcode" : "10462" }, "borough" : "Bronx", "cuisine" : "Bakery",
"grades" : [ { "date" : ISODate("2014-03-03T00:00:00Z"),
"grade" : "A", "score" : 2 }, { "date" : ISODate("2013-09-11T00:00:00Z"),
"grade" : "A", "score" : 6 }, { "date" : ISODate("2013-01-24T00:00:00Z"),
"grade" : "A", "score" : 10 }, { "date" : ISODate("2011-11-23T00:00:00Z"),

5
"grade" : "A", "score" : 9 }, { "date" : ISODate("2011-03-10T00:00:00Z"),
"grade" : "B", "score" : 14 } ], "name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445" }
....

Para hacer una proyección de los campos:

> db.restaurants.find({},{"name":1})
{ "_id" : ObjectId("558afebcac4eb6ce33c2f648"), "name" : "Morris Park Bake Shop" }
{ "_id" : ObjectId("558afebcac4eb6ce33c2f649"), "name" : "Wendy’S" }
{ "_id" : ObjectId("558afebcac4eb6ce33c2f64b"), "name" : "Riviera Caterer" }
{ "_id" : ObjectId("558afebcac4eb6ce33c2f64e"), "name" : "Kosher Island" }
...

Se puede especificar condiciones de igualdad:

> db.restaurants.find( { "borough": "Manhattan" } )

{ "_id" : ObjectId("558afebcac4eb6ce33c2f64a"), "address" : { "building" : "351",


"coord" : [ -73.98513559999999, 40.7676919 ], "street" : "West 57 Street",
"zipcode" : "10019" }, "borough" : "Manhattan", "cuisine" : "Irish" ... }

> db.restaurants.find( { "name": "Vella" } )

{ "_id" : ObjectId("558afebdac4eb6ce33c33b34"), "address" : { "building" : "1480",


"coord" : [ -73.9557413, 40.7720266 ], "street" : "2 Avenue", "zipcode" : "10075" },
"borough" : "Manhattan", "cuisine" : "Italian",
"grades" : [ { "date" : ISODate("2014-10-01T00:00:00Z"),
"grade" : "A", "score" : 11 }, { "date" : ISODate("2014-01-16T00:00:00Z"),
"grade" : "B", "score" : 17 } ], "name" : "Vella", "restaurant_id" : "41704620" }

Para filtrar por un documento embedido, por ejemplo address.zipcode se utiliza el punto para indicarlo.

> db.restaurants.find( { "address.zipcode": "10075" } )

{ "_id" : ObjectId("558afebcac4eb6ce33c2f75f"), "address" : { "building" : "1011",


"coord" : [ -73.9623333, 40.7757194 ], "street" : "Madison Avenue",
"zipcode" : "10075" }, "borough" : "Manhattan", "cuisine" : "American " ... }
...

Otros ejemplos:

6
# mayor que.
> db.restaurants.find( { "grades.score": { $gt: 30 } } )

# menor que.
> db.restaurants.find( { "grades.score": { $lt: 10 } } )

# and
> db.restaurants.find( { "cuisine": "Italian", "address.zipcode": "10075" } )

# or
> db.restaurants.find({ $or: [ { "cuisine": "Italian" }, { "address.zipcode": "10075" } ] })

Ordenando los datos. Se utiliza el método sort() donde se debe indicar los campos por cual ordenar y el
tipo de orden, 1 para ascendente y -1 para descendente.

> db.restaurants.find().sort( { "borough": 1, "address.zipcode": 1 } )

Más detalles en http://docs.mongodb.org/getting-started/shell/query/

3.3. Actualizar datos

Se utiliza el método update() para actualizar datos. No de puede actualizar el campo id.

Para modificar algún dato se tiene el operador $set. El siguiente ejemplo modifica el campo cuisine.

> db.restaurants.update(
{ "name" : "Juni" },
{
$set: { "cuisine": "American (New)" }
}
)

Otro ejemplo con documentos embedidos:

> db.restaurants.update(
{ "restaurant_id" : "41156888" },
{ $set: { "address.street": "East 31st Street" } }
)

Por defecto update() actualiza sólo un documento, para actualizar múltiples documentos utilice la opción
multi en el método update().

El siguiente ejemplo modifica todos los documentos que tengan address.zipcode 10016 y cuisine Other.

7
> db.restaurants.update(
{ "address.zipcode": "10016", cuisine: "Other" },
{
$set: { cuisine: "Category To Be Determined" }
},
{ multi: true}
)

Para reemplazar un documento completo, excepto el campo id, pase el nuevo documento como el segundo
argumento del método update(). Después de la actualización, el documento sólo contiene el o los campos en
el documento reemplazado.

> db.restaurants.update(
{ "restaurant_id" : "41704620" },
{
"name" : "Vella 2",
"address" : {
"coord" : [ -73.9557413, 40.7720266 ],
"building" : "1480",
"street" : "2 Avenue",
"zipcode" : "10075"
}
}
)

Más información en http://docs.mongodb.org/getting-started/shell/update/

3.4. Remover datos

Se utiliza el método remove() para remover documentos desde una colección. Para especificar alguna
condición se utiliza la misma estructuras que en las consultas.

> db.restaurants.remove( { "borough": "Manhattan" } )

Por defecto este método elimina todos los documentos que cumplen con la condición, para eliminar sólo
uno utilice la opción justOne:

> db.restaurants.remove( { "borough": "Queens" }, { justOne: true } )

Para remover todos los documentos de una colección:

> db.restaurants.remove( { } )

8
Para eliminar la colección:

> db.restaurants.drop()

Para borrar la base de datos:

$ mongo dbName --eval "db.dropDatabase()"

Más información en http://docs.mongodb.org/getting-started/shell/remove/

3.5. Operaciones de agregación

Obtener listado de datos no repetidos:

> db.profesores.distinct("dicta.asignatura")
[ "base de datos I", "redes", "bioinformática I" ]

Ver http://docs.mongodb.org/getting-started/shell/aggregation/

3.6. Índices

Los ı́ndices se utilizan para hacer más eficientes las consultas. MongoDB crea automáticamente un ı́ndice
en el campo id en la creación de la colección. El método createIndex() crea ı́ndices en una colección. Se
debe especificar la lista de campos y el tipo de ı́ndice a utilizar en ellos.

Para un ı́ndice de tipo ascendente utilice 1.


Para un ı́ndice de tipo descendente utilice -1.

Ejemplos:

> db.restaurants.createIndex( { "cuisine": 1 } )

# debe arrojar un documento con el resultado de la operación:


{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
>

Más información en http://docs.mongodb.org/getting-started/shell/indexes/

También podría gustarte