Oficina de Software Libre de la Universidad de Granada
(Twitter:@OSLUGR/
Facebook:@SoftwareLibreUGR)
Granada Geek
(http://www.meetup.com/es-ES/Granada-Geek/)
Una base de datos es una colección de información organizada de forma que se puedan seleccionar "rápidamente" los fragmentos de datos que se necesiten.
Bases de datos que no requieren estructuras fijas en los registros de datos, usando para ello varios tipos de modelos distintos:clave-valor,orientada a documentos,en grafo...
No soportan operaciones JOIN (reuniones), ni garantizan ACID. Pero escalan horizontalmente con facilidad y sus operaciones se realizan "rápidamente".
Por el crecimiento exponencial de la información que circula en Internet. (Recordad: atomicidad y "bajo" rendimiento, además de consultas cada vez más complejas).
Cada elemento es identificado por una clave única y la información se almacena generalmente en un objeto binario.
Almacenan la información en estructuras simples estandarizadas como JSON, XML o BSON sobre las que se pueden realizar búsquedas por clave-valor o realizar consultas más avanzadas.
Mediante la teoría de grafos usa nodos y aristas para representar la información. Muy útil para representar modelos con muchas relaciones como las redes sociales.
Modelo relacional | MongoDB |
---|---|
Base de datos | Base de datos |
Tabla | Colecciones |
Filas | Documentos |
Columnas | Campos |
Uso de cursores para contar registros o iterar sobre la información.
Mediante el uso de BSON (Binary JSON), una versión modificada de JSON que guarda de forma explícita información útil para realizar búsquedas rápidas de datos.
Todos los documentos tienen un campo "_id" único.
{
"_id": ObjectId("4efa9f2b7d343dad555e4bc7"),
"nombre": "German",
"apellidos": "Martinez Maldonado",
"edad": 28,
"genero_favorito": "Drama",
"series": [
{
"nombre":"Breaking Bad",
"genero":"Drama",
"nota":10,
"comentario":"La mejor serie de la historia"
},
{
"nombre":"Doctor Who",
"genero":"Ciencia Ficcion",
"nota":9,
"comentario":"Ojala yo teniendo una TARDIS ahora"
},
{
"nombre":"LOST",
"genero":"Ciencia Ficcion",
"nota":4,
"comentario":"El final más meh de la historia"
}
]
}
Es un interfaz JavaScript interactivo que nos permite conectarnos a MongoDB.
CREATE (insert):
SQL: INSERT INTO usuarios VALUES ("Tipo", "De Incognito"...)
> db.usuarios.insert(
{
"nombre": "Tipo",
"apellidos": "De Incognito",
"edad": 43,
"genero_favorito": "Humor",
"series": [
{
"nombre":"Los Simpsons",
"genero":"Humor",
"nota":7,
"comentario":"A partir de la temporada 11 dejaron de tener gracia."
}
]
}
)
READ (find / findOne):
SQL:
SELECT nombre, edad, favoritos FROM usuarios WHERE edad > 20 LIMIT 5 ORDER BY edad ASC
> db.usuarios.find( ⬅️️ coleccion
{ edad: { $gt: 20 } }, ⬅️️ filtro
[{nombre: 1, edad: 1, genero_favorito: 0 }] ⬅️️ proyeccion
).limit(5).sort( {edad: 1 } ) ⬅️️ modificadores
UPDATE (update):
SQL:
UPDATE usuarios SET genero_favorito = "Drama" WHERE edad > 30
> db.usuarios.update( ⬅️️ coleccion
{ edad: { $gt: 30 } }, ⬅️️ filtro
{ $set: { genero_favorito: "Drama"} }, ⬅️️ accion [$set|$unset|$inc]
{ multi: true } ) ⬅️️ opcion [$multi|$upsert]
REMOVE (delete):
SQL:
DELETE FROM usuarios WHERE edad > 30
> db.usuarios.remove( ⬅️️ coleccion
{ edad: { $gt: 30 } ) ⬅️️ filtro
Se aplican varias acciones a los documentos para obtener los resultados necesarios
SQL | MongoDB |
---|---|
SELECT | $project |
WHERE | $match |
GROUP BY | $group |
HAVING | $match |
ORDER BY | $sort |
LIMIT | $limit |
SUM | $sum |
SELECT Localidad, AVG (Facturacion) "FACTURACION MEDIA"
FROM pedidos
WHERE Localidad <> "Jaen"
GROUP BY Localidad
HAVING AVG (Facturacion) > 5000
ORDER BY Localidad ASC;
db.pedidos.aggregate({
$sort: {
"Localidad": -1
}
}, {
$match: {
"Localidad": {
"$ne": "Jaen"
}
}
}, {
$group: {
_id: {
$toUpper: "$Localidad"
},
"FACTURACION MEDIA": {
$avg: "$Facturacion"
}
}
}, {
$match: {
"FACTURACION MEDIA": {
$gt: 5000
}
}
})
Ejemplo usando base de datos libre GeoWorldMap para calcular el par de ciudades que se encuentran más cercanas en cada país, excluyendo a Estados Unidos.
db.runCommand({
mapReduce: "cities",
map: function Map() {
var key = this.CountryID;
emit(key, {
"data": [{
"name": this.City,
"lat": this.Latitude,
"lon": this.Longitude
}]
});
},
reduce: function Reduce(key, values) {
var reduced = {
"data": []
};
for (var i in values) {
var inter = values[i];
for (var j in inter.data) {
reduced.data.push(inter.data[j]);
}
}
return reduced;
},
finalize: function Finalize(key, reduced) {
if (reduced.data.length == 1) {
return {
"message": "Este país sólo tiene una ciudad"
};
}
var min_dist = 999999999999;
var city1 = {
"name": ""
};
var city2 = {
"name": ""
};
var c1;
var c2;
var d;
for (var i in reduced.data) {
for (var j in reduced.data) {
if (i >= j) continue;
c1 = reduced.data[i];
c2 = reduced.data[j];
d = (c1.lat - c2.lat) * (c1.lat - c2.lat) + (c1.lon - c2.lon) * (c1.lon - c2.lon);
if (d < min_dist && d > 0) {
min_dist = d;
city1 = c1;
city2 = c2;
}
}
}
return {
"city1": city1.name,
"city2": city2.name,
"dist": Math.sqrt(min_dist)
};
},
query: {
"CountryID": {
"$ne": 254
}
},
out: {
merge: "ciudades_proximas"
}
});
db.ciudades_proximas.find({}, {
"_id": 0
})