Gestión de Bases de Datos
SGBD no Relacionales
Conchi Guisado Jurado
Raúl Ruiz Padilla
Curso 21-22
Índice
1. Introducción a MongoDB. Ventajas e Inconvenientes.
2. Instalación de MongoDB.
3. Colecciones y Documentos. Linking y Embedding.
4. Operaciones CRUD
4.1. Inserción de documentos.
4.2. Borrado de documentos
4.3. Actualización de documentos
4.4. Consultas
4.4.1. Consultas con tipos de datos simples
4.4.2. Consultas con arrays
4.4.3. Consultas con documentos embebidos o anidados
1. Introducción a MongoDB. Ventajas e inconvenientes.
Después de muchos años en los que los SGBD relacionales ocupaban
casi la totalidad del mercado de BBDD, han irrumpido con fuerza los
SGBDs no relacionales.
Existen varios tipos de SGBDnoR con múltiples implementaciones
comerciales:
● Orientados a objeto (db4o, GemStone,...)
● Documentales (MongoDB, CouchDB, SimpleDB...)
● Clave-valor (Cassandra, BigTable, Dynamo...)
● En grafo (HyperGraphDB, AllegroGraph, DEX...)
● Multivalor (OpenQM)
● Etc...
1. Introducción a MongoDB. Ventajas e inconvenientes.
Estos SGBDR no relacionales son bastante diferentes entre sí. Nosotros
nos vamos a centrar en MongoDB, un SGBD documental de código
abierto con una implantación creciente en el mercado.
Las dos ventajas fundamentales de MongoDB son:
● Facilidad para el escalado horizontal.
● Flexibilidad en el almacenamiento.
El inconveniente principal es la dificultad para establecer relaciones
entre los documentos o para consultar información que se encuentra
repartida entre distintos nodos.
2. Instalación de MongoDB.
Aunque MongoDb se ejecuta típicamente en un cluster de máquinas,
aquí nos limitaremos a instalarlo en un único nodo.
Se descarga gratuitamente de mongodb.com y existen versiones para
Linux y para Windows.
El proceso de instalación es muy sencillo y, una vez realizado, debéis
lanzar el proceso mongod para arrancar el servidor y el proceso mongo
para lanzar el intérprete de comandos (“shell”).
Para ver las BBDD existentes se usa el comando show dbs, para usar
una BD concreta emplearéis use nombreDB.
En cualquier momento podéis teclear help para obtener ayuda o exit
para salir.
3. Colecciones y Documentos. Linking y Embedding.
En MongoDB la información no se almacena en registros dentro de
tablas, ya que no se trata de un SGBD relacional.
En lugar de tablas, en MongoDB se emplean colecciones. A diferencia
de las tablas, las colecciones no tienen unos campos predefinidos.
Así, las colecciones no son más que un conjunto de documentos sin
una estructura predefinida pero que guardan información sobre objetos
similares de una forma u otra.
De esta forma, los documentos de una colección no tienen porque
contener siempre los mismos campos, sino que existe un alto grado de
flexibilidad en la información que almacenan.
Los documentos se escriben en formato JSON, aunque internamente se
almacenan en un formato llamado BSON.
3. Colecciones y Documentos. Linking y Embedding.
Veamos que puede contener un documento en MongoDB:
● Identificador del documento (Object_ID)
● Números (reales o enteros)
● Cadenas
● Fechas
● Listas o Arrays
● Subdocumentos (Embedding)
● Referencias a otros Documentos (Linking)
Veamos un ejemplo de esto sobre un documento real.
3. Colecciones y Documentos. Linking y Embedding.
{
“_id” : “4db3e2b3b22b3b4b5b5b5b05”
“title” : “El dolor del alumno nazareno de BBDD”,
“body” : “Nunca pensé que mi dolor pudiera ser tan grande, bla bla bla...”,
“published_at” : “20131-05-09T18:137:307-037:00”,
“author_info” : {
“_id” : “4dc8919331c0c00001000002”
“name” : “Samuel Guerra”
},
“tags” : [“MongoDB”, “NoSQL”, “Bases de datos”]
“comments” : [
{
“author_info” : { “name” : “Emi Alvarenga”, “email” : “
[email protected]” },
“body” : “No quiero molestar, pero no me ha gustado mucho el post”,
“created_at” : “2011-05-10T10:14:01-04:00”
},
{
“author_info” : { “name” : “Alejandro Agroba”, “email” : “
[email protected]” },
“body” : “Vaya mierda de post filosófico, no se entiende nada”,
“created_at” : “2011-05-10T10:14:09-07:00”
}
]
“liked_by” : [“4d7cf768e999f56f50000001”, “4da34c62ba875b4236700033”]
}
4. Operaciones CRUD
4.1. Inserción de documentos
Cuando se inserta un documento en una colección, ésta se creará
automáticamente si no existía ya. MongoDB proporciona los siguientes métodos
para insertar documentos en una colección:
● db.coleccion.insertOne(inserción) : inserta un solo documento en la colección
db.autores.insertOne(
{ nombre: “Samuel”, email:”'
[email protected]”, grupos:[“futbol”,”informática”]})
● db.coleccion.insertMany(inserción) : inserta varios documentos en la
colección
db.autores.insertMany([
{ nombre:“Samuel”, email :”'
[email protected]”, grupos: [“futbol”,”informática”]},
{ nombre : “Maria”, email :”'
[email protected]”, grupos:: [“baloncesto”,”fisica”]}
])
4. Operaciones CRUD
4.2. Borrado de documentos
MongoDB proporciona los siguientes métodos para eliminar documentos en una
colección:
● db.coleccion.deleteOne(filtro) : elimina el primer documento en la colección
que cumple la condición
db.autores.deleteOne({nombre: “Samuel”})
● db.coleccion.deleteMany(condición) : elimina todos los documentos en la
colección que cumplen la condición
db.autores.deleteMany({ grupos: ”informática”})
db.autores.deleteMany({}) elimina todos los elementos de la colección
4. Operaciones CRUD
4.3. Actualización de documentos
MongoDB proporciona los siguientes métodos para actualizar documentos en una
colección:
● db.coleccion.updatetOne(filtro,actualización) : actualiza el primer documento
que cumple la condición en la colección
db.autores.updatetOne({nombre: “Samuel”}, {$set { email:”'
[email protected]”}})
● db.coleccion.updateMany(filtro,actualización) : actualiza los documentos en la
colección que cumplen la condición
db.autores.updateMany({grupos: “informática”}, {$set {nombre:”Manuel”}})
● db.coleccion.replaceOne(filtro,actualización) : reemplaza el primer documento
que cumpla la condición en la colección por el indicado en la actualización
db.autores.replaceOne({ nombre: “María”}, {nombre:“Marial”, tlf: 666666666})
4. Operaciones CRUD
4.4.1. Consultas con tipos de datos simples
La sintaxis para consultas es bastante compleja pues los criterios de selección
deben escribirse en JSON, la forma más general sería:
db.coleccion.find({criterios de selección},{proyección});
Si quiero mostrar todos los documentos de una colección, la sintaxis a usar es
muy simple:
db.autores.find() o db.autores.find({}) o db.autores.find().pretty() – equivaldría a
select * from autores;
Como puedes ver, a todos los documentos se les agrega automáticamente un
campo llamado _id, cuyo valor es único dentro de la colección.
Para averiguar el número de documentos de una colección:
db.autores.count()
4. Operaciones CRUD
4.4.1. Consultas con tipos de datos simples
Si queremos filtrar la búsqueda de documentos incluyendo alguna condición, la
sintaxis se complica un poco. Veamos un ejemplo:
db.autores.find({nombre:”Alejandro Nieto”});
(equivale a select * from autores where nombre=”Alejandro Nieto”;)
Si queremos filtrar por más de una condición y que se cumplan TODAS,
debemos hacer:
db.autores.find({edad:18,sexo:”M”});
(equivale a select * from autores where edad=18 AND sexo=”M”;)
Si por el contrario lo que quiero es mostrar los documentos de la colección que
cumplan alguna de entre varias condiciones, la sintaxis se complica algo más:
db.autores.find({$or:[{edad:18},{sexo:”M”} ] } );
(Equivale a select * from autores where edad=18 OR sexo='M';
4. Operaciones CRUD
4.4.1. Consultas con tipos de datos simples
Si solo quiero mostrar algunos atributos del documento:
db.autores.find({},{nombre:1, email:1});
(Equivale a select nombre, email from autores;)
Si queremos mostrar la salida con una ordenación concreta, emplearemos el
modificador sort, así:
db.autores.find({},{nombre:1, email:1}).sort({edad:1})
(Equivale a select nombre, email from autores order by edad asc;)
Si queremos mostrar solo los primeros n documentos que cumplen los criterios
de la consulta podemos usar el modificador limit:
db.autores.find({},{nombre:1, email:1}).sort({edad:-1}).limit(3)
Si en el modificador sort usamos un -1 el orden será descendente.
4. Operaciones CRUD
4.4.1. Consultas con tipos de datos simples
Otros operadores útiles para la realización de consultas básicas son:uientes:
$in: (Equivale a IN)
db.productos.find({tipo:{$in:['Procesadores','Discos']}})
$gt, $gte, $lt, $lte: (Equivalen a >, >=,<,<=)
db.productos.find({precio:{$gte:2000}}, {nombre:1, precio:1})
$ne, $not, $nin: (Equivalen a !=, NOT y NOT IN)
db.productos.find({precio:{$ne:1000}}, {nombre:1, precio:1})
$exists (para mostrar los documentos para los que existe un campo
determinado, obviamente no hay equivalente en SQL)
db.productos.find({accesorios:{$exists:true}}, {nombre:1, precio:1})
4. Operaciones CRUD
4.4.2. Consultas con arrays
En MongoDB podemos tener un atributo en un documento que sea un array o
lista de valores. Por ejemplo, en una colección “posts”, algunos de los
documentos pueden tener un atributo “tags” donde podemos almacenar más de
un valor con las etiquetas de ese post.
db.posts.find({tags:['Procesadores','Discos']})
Muestra los posts cuyas etiquetas son exactamente Procesadores y Discos
db.posts.find({tags:{$all: ['Procesadores','Discos']}})
Muestra los posts cuyas etiquetas incluye Procesadores y Discos en cualquier
orden
db.posts.find({tags: 'Procesadores’})
Muestra los posts cuya etiqueta es Procesadores
4. Operaciones CRUD
4.4.3. Consultas con documentos embebidos o anidados
¿Y que hacemos con los documentos anidados?
En MongoDB podemos tener un atributo en un documento que sea a su vez un
documento. Por ejemplo, en nuestra colección “posts”, los documentos tienen
un atributo “author_info” que es a su vez un documento con la información del
autor del post.
Para consultar información dentro de un documento anidado en otro, la sintaxis
usa la notación puntuada:
posts.find({“author_info.name”=”Samuel Guerra”})
Con varios puntos podemos bajar varios niveles, por ejemplo para mostrar los
posts en los que hizo comentarios una persona determinada:
posts.find({comments.author_info.name=”Alejandro Agroba”})