Lab 1
Lab 1
Lab 1
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL EN BIOINFORMÁTICA
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).
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
# /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
{
"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"
}
En la terminal ejecutamos el comando mongoimport para insertar los datos en la base de datos.
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.
$ mongo
MongoDB shell version: 2.4.14
connecting to: test
>
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"
... }
... )
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()
5
"grade" : "A", "score" : 9 }, { "date" : ISODate("2011-03-10T00:00:00Z"),
"grade" : "B", "score" : 14 } ], "name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445" }
....
> 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" }
...
Para filtrar por un documento embedido, por ejemplo address.zipcode se utiliza el punto para indicarlo.
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.
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)" }
}
)
> 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"
}
}
)
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.
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( { } )
8
Para eliminar la colección:
> db.restaurants.drop()
> 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.
Ejemplos: