Data">
Nothing Special   »   [go: up one dir, main page]

Clase 18 - CRUD en MongoDB

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 59

Clase 18.

Programación Backend

CRUD en MongoDB
● Comprender el significado de CRUD.

● Aprender el lenguaje de consultas de


MongoDB.

OBJETIVOS DE LA CLASE
● Crear y configurar cuentas de usuario, para
definir roles que representarán permisos de
acceso y operación en la base de datos.
CRONOGRAMA DEL CURSO
Clase 17 Clase 18 Clase 19

MongoDB CRUD en MongoDB NodeJS, MongoDB and


DBaaS
CRUD en MongoDB
INTRODUCCIÓN
CRUD
La base de la gestión de datos
El concepto CRUD está estrechamente vinculado a la gestión de
datos digitales. CRUD hace referencia a un acrónimo en el que se
reúnen las primeras letras de las cuatro operaciones fundamentales
de aplicaciones persistentes en sistemas de bases de datos

● Create (Crear registros)


● Read ó Retrieve (Leer registros)
● Update (Actualizar registros)
● Delete ó Destroy (Borrar registros)
CRUD: Conceptos
● CRUD resume las funciones requeridas por un usuario para crear y gestionar
datos.
● Muchos procesos de gestión de datos están basados en CRUD, en los que
dichas operaciones están específicamente adaptadas a los requisitos del
sistema y de usuario, ya sea para la gestión de bases de datos o para el uso
de aplicaciones.
● Para los expertos, las operaciones son las herramientas de acceso típicas e
indispensables para comprobar, por ejemplo, los problemas de la base de
datos.
● Para los usuarios, CRUD significa crear una cuenta (create) y utilizarla
(read), actualizarla (update) o borrarla (delete) en cualquier momento.
Comandos en MongoDB
MongoDB: Listado de Comandos
Conexión a la base mediante un cliente CLI

Comandos Helpers
● show dbs: listado de bases no vacías
● use: crea y selecciona base de trabajo
● db: muestra la base actual
● show collections: listado de colecciones
● load: carga un script de comandos
MongoDB: Listado de Comandos
Manejo de Base de datos y Colecciones
MongoDB: Detalle de Comandos
● db.coll.drop() : borra una colección y sus índices respectivos.
● db.dropDatabase() : elimina la base de datos actual.
● db.createCollection("contacts") : crea una colección en forma explícita.
● db.coll.stats() : refleja estadísticas del uso de la base.
● db.coll.storageSize() : tamaño de almacenamiento de la colección.
● db.coll.totalIndexSize() : tamaño total de todos los índices de la colección.
● db.coll.totalSize(): tamaño total en bytes de los datos de la colección más el
tamaño de cada índice de la colección.
● db.coll.validate({full: true}) : comprueba la integridad de una colección.
● db.coll.renameCollection("new_coll", true) : renombra una colección, el 2do
parámetro para borrar la colección destino si existe.
MongoDB: Comandos CRUD
CREATE y READ
Comando Create (insert)

Comando Read (find)


MongoDB: Detalle de Comandos
(2)
● db.coll.insertOne( {key:value} ) : inserta un documento en la colección.
● db.coll.insert( {key:value} ) : inserta un documento en la colección (en desuso).
● db.coll.insertMany( [ {key:value}, {key:value}, {key:value} ] ) : inserta un array de
documentos la colección en modo Bulk.
● db.coll.findOne() : busca un documento dentro de una colección.
● db.coll.find() : busca todos los documentos dentro de una colección.
● db.coll.find( {key:value} ) : busca los documentos dentro de una colección que
satisfacen el filtro de búsqueda.
● db.coll.find().pretty() : devuelve todos los documentos conservando el formato de
objeto de salida.
FORMATO DE DOCUMENTO
Formato de documento
Cuando insertamos un documento en MongoDB, el motor de base de datos crea un
campo adicional llamado ObjectID identificado con la clave _id.
Este es un número compuesto por 12 bytes que asegura un identificador único para
cada documento. Se considera clave primaria y contiene tres secciones:
https://docs.mongodb.com/manual/reference/method/ObjectId/
ObjectID: Timestamp converter
Website: https://steveridout.github.io/mongo-object-time/
CONTADORES
MongoDB: Contadores

Comandos Count
Son funciones que cuentan la cantidad de documentos presentes en
una colección. Algunas de ellas pueden tener la opción de filtro.
MongoDB: Contadores

● db.coll.estimatedDocumentCount()
Devuelve la cantidad total de documentos encontrados en la colección.
● db.coll.countDocuments( {key: val} )
Devuelve la cantidad de documentos encontrados en la colección (con
filtro de query).
CRUD
Tiempo: 10 minutos
Utilizando Mongo shell, realizar las siguientes acciones:
1) Crear una base de datos en MongoDB llamada 'empresa'.
2) Crear una colección llamada 'clientes' dentro de esa base.
3) Insertar un documento en la colección clientes que contenga los campos ‘nombre’ y
‘edad’.
4) Insertar un array de tres documentos con el mismo formato y valores distintos en la
colección clientes (modo bulk).
5) Utilizando un sólo comando, crear una colección llamada 'articulos' e insertar dentro
de ella un array de cuatro documentos con los campos ‘nombre’, ‘precio’ y ‘stock’.
6) Mostrar las colecciones de la base 'empresa'.
7) Listar todos los documentos dentro de cada una de las colecciones.
8) Tomar el Object ID de uno de los documentos y comprobar fecha y hora de creación.
9) Mostrar la cantidad de documentos que tiene la colección articulos.

BREAK
¡5/10 MINUTOS Y VOLVEMOS!
FILTROS
MongoDB: Comandos CRUD
READ con Filtros
Comando Read con filtros de búsqueda
db.coll.find( {key: {$operator: val}} ) : devuelve los documentos según el
operador de filtro utilizado.
MongoDB: Operadores
para Filtros de Query
● $and : Realiza operación AND -> sintaxis: {$and: [ {},{} ] }
● $or : Realiza operación OR -> sintaxis: {$or: [ {},{} ] }
● $lt : Coincide con valores que son menores que un valor especificado.
● $lte : Coincide con valores menores o iguales a un valor especificado.
● $gt : Coincide con valores mayores a un valor especificado.
● $gte : Coincide con valores mayores o iguales a un valor especificado.
● $ne : Coincide con valores que no son iguales a un valor especificado.
● $eq : Selecciona los documentos que son iguales a un valor
especificado.
MongoDB: Operadores
para Filtros de Query
● $exists : Selecciona los documentos según la existencia de un campo.
● $in : Selecciona los documentos especificados en un array.
sintaxis: {key:{$in: [array of values] } }
● $nin : Coincide con ninguno de los valores especificados en un array.
● $size : Coincide con el número de elementos especificados.
● $all : Coincide con todos los valores definidos dentro de un array.
● $elemMatch : Coincide con algún valor definido dentro del query.

https://docs.mongodb.com/manual/reference/operator/query/
MongoDB: Comandos CRUD
READ con Filtros combinados
Comando Read con filtros de búsqueda combinados

MongoDB
Búsqueda Avanzada
● db.coll.distinct( val )
devuelve un array con los distintos valores que toma un
determinado campo en los documentos de la colección.

● db.coll.find({doc.subdoc:value})
Se utiliza para filtrar subdocumentos.

● db.coll.find({name: /^Max$/i})
filtra utilizando expresiones regulares
MongoDB: Comandos CRUD
READ con Filtros avanzados
Comando Read con filtros avanzados y proyección

Proyecciones en MongoDB
● La proyección se utiliza para devolver un conjunto determinado de
campos de un documento. En general devolvemos todos los campos de
un documento, pero es posible que no necesitemos todos.
● Es equivalente en SQL de pasar de hacer un SELECT * a realizar SELECT
nombrecampo.
● Las proyecciones deben ser incorporadas en el segundo parámetro del
comando find. Por ej. db.coll.find({},{"nombre":1}) muestra sólo el
campo nombre y el _id de todos documentos de la coll
● Las proyecciones se realizan indicando el nombre del campo,
con valor 1 si queremos mostrarlo y 0 por el contrario.
MongoDB: sort limit skip
● sort( { campoA: 1 ó -1 , campoB: 1 ó -1 , ... } ) : Especifica el orden en el
que la consulta devuelve documentos coincidentes. El ó los campos por los
cuales ordena pueden contener los valores 1 y -1, estableciendo orden
ascendente y descendente respectivamente. El orden se evalúa de izquierda
a derecha en caso que los valores coincidan.
● limit(num): Especifica el número máximo de documentos devueltos.
● skip(offset) : Saltea la cantidad de documentos especificada.

Se pueden utilizar en forma combinada:


db.Employee.find().skip(2).limit(3).sort({Employeeid:-1})
UPDATE Y DELETE
MongoDB: Comandos CRUD
UPDATE
Comando Update (update)
MongoDB: Comandos CRUD
UPDATE
Comando Update y variantes
UPDATE: Detalle de Comando
db.collection.updateOne(query, update, options)
● query: especifica el filtro de documentos a ser actualizados.
● update: contiene los datos a ser actualizados con sus operadores
respectivos: $set, $unset, $inc, $rename, $mul, $min, $max, etc.
● options: contiene varias opciones para la actualización, entre ellas:
- upsert (true ó false) : Es una opción para hacer un insert en caso de
que el registro no exista.
db.coll.updateMany(query, update, options)
- Igual que el anterior, pero hace una actualización múltiple en caso
de que el filtro de query devuelva varios resultados.
MongoDB Comandos CRUD
DELETE
Comando Delete (delete)
DELETE
Detalle de Comando
● db.coll.deleteOne( {key: val} ): Elimina un sólo documento (el
primero) que coincide con el filtro especificado.
● db.coll.deleteMany( {key: val} ): Elimina todos los documentos que
coinciden con el filtro especificado.
● db.coll.remove( {key: val} ): Elimina documentos de una colección.
● db.coll.findOneAndDelete( filter, options ): Elimina un solo
documento según el filtro y los criterios de clasificación. Algunas de las
options pueden ser
- sort: para establecer orden para el filtro
- projection: para elegir campos de salida.
MongoDB Cheat Sheet Commands
MongoDB Cheat Sheet Commands
OPERACIONES CON FILTROS
Tiempo: 15 minutos
Sobre la base y los datos cargados anteriormente
1) Insertar cinco documentos más en la colección clientes con los siguientes datos:
{ "nombre" : "Pablo", "edad" : 25 }
{ "nombre" : "Juan", "edad" : 22 }
{ "nombre" : "Lucia", "edad" : 25 }
{ "nombre" : "Juan", "edad" : 29 }
{ "nombre" : "Fede", "edad" : 35 }
2) Listar todos los documentos de la colección clientes ordenados por edad
descendente.
3) Listar el cliente más joven.
4) Listar el segundo cliente más joven.
5) Listar los clientes llamados 'Juan'
6) Listar los clientes llamados 'Juan' que tengan 29 años.
7) Listar los clientes llamados 'Juan' ó 'Lucia'.
8) Listar los clientes que tengan más de 25 años.
9) Listar los clientes que tengan 25 años ó menos.
10) Listar los clientes que NO tengan 25 años.
11) Listar los clientes que estén entre los 26 y 35 años.
12) Actualizar la edad de Fede a 36 años, listando y verificando que no aparezca en el
último listado.
13) Actualizar todas las edades de 25 años a 26 años, listando y verificando que
aparezcan en el último listado.
14) Borrar los clientes que se llamen 'Juan' y listar verificando el resultado.
Usuarios y permisos
MongoDB
Usuarios y permisos
Creación de un usuario con permisos y su eliminación

Permisos y Roles
https://docs.mongodb.com/manual/tutorial/manage-users-and-roles/
https://docs.mongodb.com/manual/reference/built-in-roles/
Crear usuarios y asignar
roles en MongoDB
En MongoDB es posible crear usuarios y asignarles acceso
mediante roles. Veremos cómo crear un usuario y asignarle un rol para
que tenga ciertos accesos limitados a una base de datos.

Crearemos dos usuarios para una base de datos


● Usuario lector: tendrá acceso de lectura a la base de datos.
● Usuario escritor: tendrá acceso de lectura y escritura a la base
de datos.
Creando un usuario de
solo lectura
Crearemos el usuario lector, que solo tiene acceso de lectura.

Utilizaremos el método createUser. Este acepta como parámetro un objeto


con las siguientes propiedades:
● user: nombre del usuario. Le asignaremos lector.
● pwd: contraseña para el usuario.
● roles: arreglo de objetos. Sirve si el usuario tendrá acceso a múltiples
bases de datos, estableciendo permisos para cada acceso.
Creando un usuario de
solo lectura
IMPORTANTE:
● Ejecutar el servidor con acceso root: mongod
● Ejecutar en el cliente use admin antes de createUser(...)
● MongoDB viene con roles
db.createUser(
{ predefinidos. Uno de ellos es el
user: "lector",
pwd: "123456",
role read, que permite ejecutar
roles: [ métodos de sólo lectura.
{ role: "read", db: "blog" }
] ● La propiedad db es donde se
}
)
indica a qué base de datos se le
asignará dicho rol.
Creando un usuario de
escritura y lectura
Crearemos el usuario escritor. El proceso es
similar, pero en este caso el role ya no será read
sino readWrite.

db.createUser(
Con el rol readWrite el usuario
{ tendrá acceso a los métodos de
user: "escritor",
pwd: "123456", lectura y escritura de la base de
roles: [
{ role: "readWrite", db: "blog" }
datos.
] A continuación debemos verificar
}
) que cada usuario cuenta con los
accesos correctos.
Pruebas de acceso: usuario read
1. Para poder ingresar al shell de mongo con el usuario usaremos los parámetros -u y -p.
mongo -u lector -p 123456

2. Verificamos si podemos leer los posts


use blog;
db.posts.find();

3. Obtenemos respuesta correctamente, mostrando los dos documentos existentes


{ "_id" : ObjectId("5e438449ea91620ed74d3cf3"), "title" : "Articulo 1" }
{ "_id" : ObjectId("5e43844cea91620ed74d3cf4"), "title" : "Articulo 2" }

4. Ahora intentaremos insertar un nuevo documento


db.posts.insertOne({ title: "Articulo 3" });

5. Debería lanzarnos un error parecido al siguiente:


{
"errmsg" : "not authorized on blog to execute command" # mensaje cortado por temas de espacio
"codeName" : "Unauthorized"
}
Pruebas de acceso: usuario write
1. Para el usuario escritor, primero debemos salir del shell y volver a loguearnos:
mongo -u escritor -p 123456 --authenticationDatabase blog

2. Leemos los posts usando el método find:


db.posts.find();
# { "_id" : ObjectId("5e438449ea91620ed74d3cf3"), "title" : "Articulo 1" }
# { "_id" : ObjectId("5e43844cea91620ed74d3cf4"), "title" : "Articulo 2" }

3. Funciona bien el permiso de lectura, ahora intentaremos insertar el Artículo #3:


db.posts.insertOne({ title: "Articulo 3" });
4. Funciona bien el permiso de lectura, ahora intentaremos insertar el Artículo #3:
{
"acknowledged" : true,
"insertedId" :
ObjectId("5e4385e6e2306e7554d9e60f")
}

Para estas pruebas, es importante ejecutar el servidor en modo


autenticación: usar el comando mongod --auth
USUARIO ‘ENCARGADO’
Tiempo: 10 minutos
1) Crear un usuario que acceda con nombre 'encargado' y clave 'qwerty123' sólo a la
base 'empresa' y tenga permisos de lectura/escritura.
2) Acceder con ese usuario y listar de la colección clientes sólo los nombres de los
mismos.
3) Verificar que no pueda acceder si sus credenciales no corresponden.
9

MONGODB
MONGODB
Formato: archivo de texto con las consultas realizadas y la carpeta de la
base de datos comprimida en un zip.
Sugerencia: Si es un archivo en línea, configurar los permisos de acceso.

>> Consigna: Utilizando Mongo Shell, crear una base de datos llamada ecommerce que contenga
dos colecciones: mensajes y productos.

1) Agregar 10 documentos con valores distintos a las colecciones mensajes y productos. El


formato de los documentos debe estar en correspondencia con el que venimos utilizando en
el entregable con base de datos MariaDB.
2) Definir las claves de los documentos en relación a los campos de las tablas de esa base. En
el caso de los productos, poner valores al campo precio entre los 100 y 5000 pesos(eligiendo
valores intermedios, ej: 120, 580, 900, 1280, 1700, 2300, 2860, 3350, 4320, 4990).
3) Listar todos los documentos en cada colección.
4) Mostrar la cantidad de documentos almacenados en cada una de ellas.
MONGODB
Formato: archivo de texto con las consultas realizadas y la carpeta de la
base de datos comprimida en un zip.
Sugerencia: Si es un archivo en línea, configurar los permisos de acceso.

5) Realizar un CRUD sobre la colección de productos:


a) Agregar un producto más en la colección de productos
b) Realizar una consulta por nombre de producto específico:
i) Listar los productos con precio menor a 1000 pesos.
ii) Listar los productos con precio entre los 1000 a 3000 pesos.
iii) Listar los productos con precio mayor a 3000 pesos.
iv) Realizar una consulta que traiga sólo el nombre del tercer producto más barato.
c) Hacer una actualización sobre todos los productos, agregando el campo stock a todos
ellos con un valor de 100.
d) Cambiar el stock a cero de los productos con precios mayores a 4000 pesos.
e) Borrar los productos con precio menor a 1000 pesos
6) Crear un usuario 'pepe' clave: 'asd456' que sólo pueda leer la base de datos ecommerce.
Verificar que pepe no pueda cambiar la información.
¿PREGUNTAS?
¡MUCHAS GRACIAS!
Resumen de lo visto en clase hoy:
- Operaciones CRUD en MongoDB
- Listado y detalle de comandos
- Manejo de usuarios y roles
OPINA Y VALORA ESTA CLASE
#DEMOCRATIZANDOLAEDUCACIÓN

También podría gustarte