Guía de MongoDB y Atlas en PDF
Guía de MongoDB y Atlas en PDF
2
APUNTES Y EJERCICIOS
MONGO DB Y ATLAS
TEMARIO
Section 1: PHILOSOPHY AND FEATURES (7%)
momento sin pérdida de servicio o datos. Esto se aplica tanto a los servidores
locales como a MongoDB Atlas, que ofrece un servicio de base de datos multi-
3
documento, calcular nuevos valores basados en otros campos, ordenar y truncar
de base de datos que agrupan múltiples cambios en una base de datos y los
programación populares.
MÁXIMO DE 16Mb.
4
MongoDB y las bases de datos RDBMS (Relational Database Management System)
Por otro lado, las bases de datos RDBMS utilizan un modelo de tablas con filas y
columnas.
2. Esquema: MongoDB es una base de datos sin esquema, lo que significa que no
cambio, las bases de datos RDBMS tienen un esquema predefinido con tablas y
que significa que puede distribuir los datos en múltiples servidores para manejar
grandes volúmenes de datos y tráfico. Las bases de datos RDBMS suelen ser
un solo servidor.
datos RDBMS utilizan SQL (Structured Query Language) para realizar consultas
5
5. Transacciones: MongoDB admite transacciones ACID (Atomicidad,
TABLAS DE COMPARACIÓN:
6
1.3 Identify the methods to access and administer a MongoDB.
Los métodos para acceder y administrar una base de datos MongoDB se conocen como
"Database Methods". Estos métodos te permiten interactuar con las bases de datos,
7
DATABASE METHODS TABLE
NOMBRE DESCRIPCIÓN
8
[Link]() Terminates a specified operation.
de los datos fragmentados. Esto permite que MongoDB maneje grandes volúmenes de
Además, MongoDB utiliza "mongos" como enrutador de consultas. El mongos actúa como
interfaz entre las aplicaciones cliente y el clúster fragmentado. Recibe las consultas de las
aplicaciones cliente y las enruta a los shards correspondientes para obtener los resultados.
insert commands.
9
2.2 Given an update scenario where an entire updated document (no
update operators used) is provided, identify the output and how the
2.2 Given an update scenario where $set is used, identify the output and
[Link](
<filter>,
<replacement>,
{ upsert: true }
10
2.4 Give a scenario where multiple documents need to be updated,
updateMany()
concurrently, identify the output and how the database changed state.
the findAndModify operation is atomic. This means that if the find condition matches a
document, the update is performed on that document, and concurrent queries and additional
updates on that document are not affected until the current update is complete.
the output of the findAndModify operation will be the updated document, and the
database will change state by modifying the specified fields in the matched document.
[Link](query);
simple equality constraint (eg {x: 3}), identify the expression that should
be used.
[Link]({ x: 3 })
on an array field.
Querying on Array Elements in MongoDB
Review the following code, which demonstrates how to query array elements in MongoDB.
11
In the following example, "InvestmentFund" is not enclosed in square brackets, so MongoDB
returns all documents within the products array that contain the specified value.
[Link]({ products: "InvestmentFund"})
Use the $elemMatch operator to find all documents that contain the specified subdocument.
For example:
[Link]({
items: {
$elemMatch: { name: "laptop", price: { $gt: 800 }, quantity:
{ $gte: 1 } },
},
})
operators in it.
logical operators.
12
● $nin: "no en" seleccionar docs donde el valor de un campo no esté dentro de un
● $all: Array All Array elements are included in field array value
2.13 Given a query with a sort and limit, identify the correct output.
matching a query.
correct output.
The $match stage filters documents based on specified conditions, while the $group
stage groups documents by a specified key.
insert commands.
13
Seguir la regla ESR (Equality, Sort, Range)
[Link](
manufacturer: 'Ford',
} ).sort( { model: 1 } )
3.3 Given a query with no constraint and a sort of two fields that is
Pero si se hace sort sobre 2 campos, el índice TIENE que estar definido igual (o
EXACTAMENTE el contrario)
14
Por ejemplo, un índice { a: 1, b: -1 } puede admitir una clasificación en { a:
3.4 Identify which index exists or the number of indexes that exist for a
collection.
[Link]()
Si indica COLLSCAN es algo que se puede mejorar, ya que hace un escaneo de toda la
Hay que intentar que en vez de COLLSCAN haya IXSCAN, que se consigue creando el
índice adecuado.
Para permitir a los usuarios evaluar el impacto potencial de eliminar un índice sin
sus consultas sin el índice y decidir si conservarlo o eliminarlo. Los índices ocultos no son
consulta.
"ok" : 0,
15
parallel arrays [exams] [homeworks]",
"code" : 16755,
"codeName" : "Location16755"
the error message indicates that the index build failed because the index includes multiple array
fields (exams and homeworks), which violates the multikey index limitation.
3.8 Identify how to validate if a query is using an index and the name of
Por ejemplo:
consulta elegido por MongoDB. Dentro, busque el campo inputStage. Este campo
Si el campo inputStage contiene una etapa IXSCAN, significa que se está utilizando un
índice para la consulta. La etapa IXSCAN representa una operación de escaneo de índice.
Para obtener el nombre del índice que se utiliza para la consulta, busque el campo
3.9 Given a query, identify the field that should be indexed first.
16
De forma predeterminada, mongod escucha las conexiones en el puerto 27017 y almacena
Para especificar un puerto TCP diferente, usar la opción --port. Por ejemplo:
En sistemas Unix/Linux:
En Windows:
mkdir -p /path/to/data/db
En sistemas Unix/Linux:
17
En sistemas Windows:
En sistemas Unix/Linux:
pkill mongod
kill PID_del_proceso_mongod
En sistemas Windows:
18
Usando un archivo de configuración:
# Ejemplo de [Link]
systemLog:
destination: file
path: "/ruta/al/archivo/de/log/[Link]"
logAppend: true
storage:
dbPath: "/ruta/al/directorio/de/datos"
net:
bindIp: [Link]
port: 27017
mongod -f /ruta/al/[Link]
19
mongod --version
cat /ruta/al/archivo/de/log/[Link]
Instalación:
mongosh "mongodb://localhost:27017/tu_base_de_datos"
[Link]("nuevo_nodo:27017")
4- Verifica el estado:
20
[Link]()
[Link]("nodo_a_eliminar:27017")
3- Verifica el estado:
[Link]()
1. Replica Set Member State Change: Indica que el estado de un miembro del
conjunto de réplicas ha cambiado. Puede ser causado por una variedad de razones,
2. High Replica Set Member Oplog Window: Se refiere a que el tiempo disponible
3. Low Free Storage Space: Indica que el espacio libre en el disco está llegando a
datos están en cola, lo que podría indicar que el servidor está experimentando una
21
5. Page Faults: Indica que el sistema operativo está teniendo dificultades para
identificar la causa.
7. CPU Usage: Alerta sobre el alto uso de la CPU, lo que podría indicar una carga
investigarse.
8. Slow Queries: Muestra que hay consultas que están tardando más de lo esperado
consultas.
10. Storage Engine Metrics: Alerta sobre métricas específicas del motor de
Conéctate al Servidor:
Ejecuta currentOp:
[Link]()
[Link]({
ns: "nombre_de_tu_base_de_datos.nombre_de_tu_coleccion"
})
22
5.3 Identify how to see currently active operations.
[Link]()
"inprog" : [
"opid" : 1,
"active" : true,
"secs_running" : 86400,
"op" : "query",
"ns" : "mi_base_de_datos.mi_coleccion",
"numYields" : 0,
"locks" : {},
"waitingForLock" : false,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(1)
23
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(1)
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(1)
(false).
24
5. op: Tipo de operación. Puede ser "query", "update", "insert", "remove", entre
otros.
operación.
df -h
25
Obtener Estadísticas de Espacio de una Base de Datos:
[Link]()
[Link]('nombre_de_tu_base_de_datos').stats()
db.nombre_de_tu_coleccion.stats()
system("df -h")
function verificarEspacio() {
if (espacioLibreGB < 5) {
setInterval(verificarEspacio, 600000);
number of connections.
1. Eje Y (Vertical): Examina la escala en el eje y del gráfico. Cada marca en el eje y
26
2. Puntos en el Gráfico: Observa los puntos individuales en el gráfico. Cada punto
3. Líneas o Barras: Dependiendo del tipo de gráfico (línea, barra, área, etc.), el
de líneas, cada punto está conectado por líneas, mientras que en un gráfico de
5. Leyenda: Si hay múltiples líneas en el gráfico, es posible que haya una leyenda
parte superior o lateral del gráfico y proporciona información sobre las series de
datos representadas.
27
Habilitar el control de acceso en una implementación de MongoDB exige la autenticación.
Con el control de acceso habilitado, los usuarios deben identificarse y solo pueden realizar
acciones que cumplan con los permisos otorgados por los roles asignados a su usuario.
Autenticación (Authentication):
control de acceso ( autorización ) está habilitado, MongoDB requiere que todos los
Mecanismos de autenticación:
certificado x.509 requiere una conexión TLS/SSL segura. Para utilizar MongoDB con x.509,
debe utilizar certificados válidos generados y firmados por una autoridad certificadora. Los
certificados de cliente x.509 deben cumplir los requisitos del certificado de cliente.
ligero de acceso a directorios (LDAP, Lightweight Directory Access Protocol). Esto significa que
28
Hay dos métodos de autenticación de proxy LDAP admitidos por MongoDB:
ENCRIPTACIÓN (ENCRYPTION)
servidor de la base de datos, asegurando que solo las partes con la clave de descifrado
puedan decodificar y leer los datos. El cifrado a nivel de disco proporciona una capa
través de la red.
seguros) para cifrar todo el tráfico de red de MongoDB. TLS/SSL garantiza que el tráfico de
In-Use Encryption: Protege los datos mientras están siendo procesados por una aplicación
o proceso en memoria.
El cifrado de nivel de campo del lado del cliente (CSFLE, Client Side Field Level) es una
red a MongoDB. Con CSFLE habilitado, ningún producto MongoDB tiene acceso a sus datos
sin cifrar.
29
Transport Layer Security (TLS): Encripta los datos para que no sean accesibles durante el
transporte verificando que el destinatario y el lector son la misma persona con una clave
pública y otra privada. En Atlas está habilitado por defecto y no se puede inhabilitar pero
para los clientes. Puedes usar herramientas como OpenSSL para este
propósito.
para habilitar TLS. Esto implica especificar los certificados, claves privadas y
([Link]).
net:
port: 27017
bindIp: [Link]
tls:
mode: requireTLS
certificateKeyFile: /ruta/al/[Link]
certificateFile: /ruta/al/[Link]
CAFile: /ruta/al/[Link]
'mode: requireTLS': Esta opción indica que las conexiones deben usar TLS.
30
3- Reiniciar MongoDB: Reinicia el servidor de MongoDB para aplicar los cambios en
la configuración.
4- Configurar Clientes para Usar TLS: Configura los clientes de MongoDB para que
conexión.
31
usuario y contraseña válidos es un mecanismo de autenticación comúnmente
utilizado.
...
security:
authorization: enabled
...
Sintaxis:
[Link]({
user: <username> ,
pwd: <password> ,
roles: [<roles_subdocuments>...]
})
Ejemplo:
[Link](
user: "globalUserAdmin",
pwd: passwordPrompt(),
32
roles: [
Otros métodos:
[Link]()
33
6.4 Identify how to assign a role to a user for authorization.
[Link](
"sally",
34
"read",
"backup"
[Link](
"sally",
[Link](
"sally",
"read",
"backup"
[Link](
35
"financeUser",
[Link](
"miRol",
[
{
Encryption at rest: Es el proceso de encriptar los datos almacenados junto con las copias
de seguridad con el fin de protegerlos de ataques físicos. El cifrado en reposo protege los
datos almacenados cifrando los archivos de datos en el servidor de la base de datos, junto
● Key management (gestión de claves): Si la clave utilizada para cifrar los datos en
36
inaccesibles. Cualquiera que tenga la clave de cifrado tendrá acceso a los datos del
servidor.
pueden usar sus privilegios para descifrar datos protegidos mediante cifrado en
reposo. Por lo tanto, estos usuarios de confianza pueden exponer o alterar los
datos.
reposo, los datos se descifran para su uso. Una vez que los datos están en uso, por
ejemplo cuando el servidor de la base de datos los procesa, son vulnerables a los
ataques.
The purpose of field-level encryption is to ensure that unauthorized parties, including server
administrators, cannot read the encrypted data.
CS-FLE- (Client-Side Field Level Encryption) : Encripta los datos antes de enviarlos al
concreto del documento, de este modo el servidor no dispone de llaves para desencriptar.
Client-Side Field Level Encryption (CSFLE) provides an additional layer of security to protect
information. CSFLE keeps data encrypted on the server both once it’s loaded into memory, as
37
La salida del log puede ser en JSON o BSON. Y el destino del flujo: SYSLOG, FILE o
CONSOLE
1. Syslog: You can enable auditing and print audit events to the syslog in JSON format.
This option is available on Linux and macOS, but not on Windows. To enable this,
specify syslog for the --auditDestination setting when starting the mongod
instance.
2. Console: You can enable auditing and print audit events to the console (stdout) in JSON
format. This option is available on all platforms. To enable this, specify console for the
3. File: You can enable auditing and write audit events to a file in either JSON or BSON
format. This option is available on all platforms. To enable this, specify the path to the
audit log file using the [Link] setting in the mongod configuration file.
NOMBRE DESCRIPCIÓN
38
[Link]() Initializes a new replica set.
[Link]() Sets the member that this replica set member will
sync from, overriding the default sync target
selection logic.
● Mantener copias adicionales de los datos para fines específicos, como recuperación
39
7.2 Identify the purpose of the primary.
primario es el único miembro del conjunto de réplicas que acepta operaciones de escritura.
Luego, registra estas operaciones en el oplog (registro de operaciones) del nodo primario.
Los miembros secundarios replican este oplog y aplican las operaciones a sus conjuntos de
datos.
Todos los miembros del conjunto de réplicas pueden aceptar operaciones de lectura. Sin
preferencias de lectura.
nodo primario actual no está disponible, se lleva a cabo una elección para determinar el
● Mantener una copia del conjunto de datos del primario: Un secundario replica
los cambios realizados en los datos del primario aplicando las operaciones del oplog
del primario a su propio conjunto de datos. Esto garantiza que el secundario tenga
inaccesible, el conjunto de réplicas realiza una elección para seleccionar uno de los
secundarios como el nuevo primario. Esto garantiza que la base de datos siga
● Permitir la lectura de datos: Aunque los clientes no pueden escribir datos en los
carga de lectura entre los secundarios y mejorar la capacidad de lectura del sistema.
40
● Configurar secundarios para propósitos específicos: Puedes configurar un
secundario para cumplir con requisitos específicos. Por ejemplo, para que no
puedes configurar un secundario para que no sea visible para las aplicaciones y se
utilice para ejecutar aplicaciones que requieren separación del tráfico normal.
enviar las operaciones de lectura a los secundarios en lugar del primario. Esto
escritura más recientes, puedes configurar la preferencia de lectura para leer desde
el primario. Esto garantiza que las operaciones de lectura reflejen los cambios más
41
3. readPreference: "secondary": Dirige las operaciones de lectura exclusivamente
Mongoshell:
[Link]().readPref("primary");
Console:
mongodb://[Link],[Link],[Link]/?
replicaSet=myRepl&readPreference=secondary&maxStalenessSeconds=
120
7.5 Identify the information that can be found in the output of [Link].
del conjunto de réplicas desde la perspectiva del miembro donde se ejecuta el método.
miembro actual.
42
● syncSourceId: El ID del miembro del que se está sincronizando el miembro
actual.
conjunto de réplicas.
en el conjunto de réplicas.
versión 4.4).
43
8. Otras propiedades que proporcionan detalles sobre la replicación y la
conexión.
confirmación que se solicita a MongoDB para las operaciones de escritura. Esto afecta
rápidamente.
● Con inquietudes de escritura más fuertes, los clientes deben esperar hasta que
solicitado.
parecer haber tenido éxito para un cliente, pero es posible que no se persistan en
[Link]({
setDefaultRWConcern : 1,
44
defaultReadConcern: { level : "majority" },
defaultWriteConcern: { w: "majority" }
})
en caso de una falla del nodo primario. Una vez elegido un nuevo nodo primario, los nodos
secundarios comienzan a replicar los cambios realizados por el nuevo nodo primario.
sea un número impar (3,5 o 7) para que las votaciones sean más eficientes.
Se inicia una elección si los miembros secundarios pierden la conectividad con el principal
forma predeterminada.
7.8 Given a replica set and the primary fails, identify what will occur.
para detectar la falla del nodo principal. Esto puede incluir el uso de heartbeat entre nodos
45
2. Elección de un Nuevo Primario: Cuando se detecta la falla del nodo principal, los nodos
restantes en el conjunto de réplicas realizan una elección de primario. Cada nodo vota por
sí mismo y por otros nodos que considera elegibles. El nodo que recibe la mayoría de los
primario, se realiza una reconfiguración del conjunto de réplicas para reflejar este cambio.
Todos los demás nodos en el conjunto actualizan su configuración para reconocer al nuevo
primario.
operaciones de escritura y lectura. Los clientes pueden dirigirse al nuevo primario para
realizar operaciones.
5. Regreso del nodo que tuvo la falla: Una vez que el nodo que falló (el primario original)
se restaura, vuelva a entrar al conjunto de réplicas como nodo secundario. Una vez que se
actualiza propone una votación en la que sí tiene mayor "priority" volverá a ser elegido
como primario.
El oplog es una 'capped collection' (Con un comportamiento similar a un 'ring buffer') que
los nodos del conjunto de réplicas. Su propósito principal es registrar todas las operaciones
de escritura que ocurren en el nodo primario (primario) para que los nodos secundarios
crucial para la elección del nuevo primario y la recuperación rápida. Cuando un nuevo
46
primario es elegido, los secundarios utilizan el oplog para ponerse al día con las
operaciones que ocurrieron durante el tiempo en que el nodo primario estaba inactivo.
operaciones que ocurren en el conjunto de réplicas. Puede ser útil para propósitos de
[Link]()
realizar una copia de seguridad inicial y luego aplicar las operaciones del oplog, se puede
El mongoimport es una herramienta que importa contenido desde un JSON extendido, CSV
terceros.
El mongoexport es una herramienta que produce una exportación JSON o CSV de datos
47
reanudar las operaciones comerciales después de un evento de interrupción. El
ejemplo, si una empresa tiene un RTO de tres horas, esto significa que todos los
corte.
datos que una empresa está dispuesta a tolerar en caso de una interrupción,
tiempo hasta el cual una empresa está dispuesta a aceptar la pérdida de datos
inactividad. Por ejemplo, si una empresa decide que puede tolerar una pérdida
de datos de dos horas, esto significa que necesitan recuperar todos los datos
Estos dos conceptos son fundamentales para desarrollar un plan de respaldo efectivo,
ya que ayudan a determinar cuánto tiempo puede llevar restaurar los sistemas y cuánta
[Link]
backup-plans-on-a-mongodb-server/learn
Tipos de Backup
1- mongodump
48
base de datos MongoDB, incluidos todos sus documentos y metadatos, y la
almacena en un formato de volcado binario BSON. Esta herramienta puede ser
útil para realizar copias de seguridad regulares de los datos de tu base de datos
MongoDB, lo que te permite recuperar los datos en caso de pérdida o
corrupción. A continuación se muestra una descripción de los archivos que
mongodump puede crear:
Archivos BSON: mongodump crea archivos BSON que contienen los datos de
la base de datos y las colecciones que se están respaldando. Estos archivos
tienen la extensión .bson. Por ejemplo, mongodump puede crear archivos
como purchase [Link].
Archivos de metadatos: mongodump también crea archivos de metadatos
que contienen información sobre las colecciones y los índices que se están
respaldando. Estos archivos tienen la extensión .[Link]. Por ejemplo,
mongodump puede crear archivos como purchase [Link].
Es importante tener en cuenta que mongodump no crea archivos JSON
directamente. En su lugar, utiliza archivos BSON para respaldar los datos de la
base de datos.
* Opciones:
-h, --host: Especifica el host y el puerto del servidor de MongoDB (separados por
: ).
-d, --db: Especifica la base de datos que se desea hacer copia de seguridad.
-c, --collection: Especifica una colección dentro de la base de datos para hacer
copia de seguridad.
49
2- mongorestore
* Propósito: Se utiliza para restaurar bases de datos MongoDB desde las copias
de seguridad creadas por mongodump.
* Funcionalidad: mongorestore toma los archivos de volcado binario BSON o de
intercambio de datos MongoDB (JSON) creados por mongodump y los restaura
en una base de datos MongoDB. Esta herramienta es útil para recuperar los
datos de una copia de seguridad después de una pérdida de datos o corrupción
en una base de datos MongoDB.A continuación se muestra una descripción de
los archivos que mongorestore puede leer:
Archivos BSON: mongorestore puede restaurar archivos BSON generados por
mongodump. Estos archivos contienen los datos de la base de datos y las
colecciones que se están restaurando. Por ejemplo, mongorestore puede
restaurar archivos como [Link].
Archivos de metadatos: mongorestore también puede leer archivos de
metadatos generados por mongodump. Estos archivos contienen información
sobre las colecciones y los índices que se están restaurando. Por ejemplo,
mongorestore puede leer archivos como [Link].
Es importante tener en cuenta que mongorestore no crea archivos JSON
directamente. En su lugar, utiliza archivos BSON para restaurar los datos en la base
de datos.
-h, --host, -d, --db, -u, --username, -p, --password, -c, --collection, -o,- -out, –
gzip : Las mismas opciones que en mongodump, pero para la operación de
restauración .
50
–writeConcern: Nos permite establecer la preocupación de escritura, que por
defecto es ‘majority’.
–archive: Permite cargar archivos con extensión ‘archive’. Son archivos que
contienen múltiples volcados BSON comprimidos, lo que puede ser útil para
transferir o almacenar grandes volúmenes de datos de forma eficiente.
3. Snapshot
51
Antes de crear un snapshot, es importante tener en cuenta algunos factores. Primero,
Después de crear el snapshot, se deben considerar los métodos para extraer los datos
del snapshot para su almacenamiento fuera de línea. Dos métodos comunes son el
volumen de snapshot es una copia completa del volumen de origen, incluidos los
cambios que ocurrieron durante la creación del snapshot. Esto se puede lograr
volumen de snapshot y utilizar herramientas del sistema de archivos, como tar, para
52
exit // Para salir de Mongoshell
[Link]()
sudo rm -r /var/lib/mongodb/*
53
A continuación, desmonte la implementación de MongoDB para poder montar el
volumen lógico recién restaurado en su lugar.
He aquí un ejemplo:
mongosh
show dbs
Capturas:
54
55
el $lookup corresponde a un LEFT OUTER JOIN y el $unionWith corresponder a un UNIONJOIN.
Con $set se añade campos de forma temporal que solo existe en mi consulta o se añaden en la
colección? En tiempo de consulta, pero se puede persistir con $merge o $out.
56
ANEXOS:
Información detallada Mecanismos de Seguridad:
administradores otorgar y restringir permisos a nivel de colección para los usuarios. Con la
se utiliza para autenticar usuarios con contraseñas. MongoDB admite dos mecanismos
57
66 preguntas. El exámen dura 90min. Los fallos no restan pero debemos sacar un 80%.
> Al venir de Javascript hay que tener en cuenta las reglas de JS y las palabras reservadas técnicamente en
minusculas todo.
58
Mongo es de tipo documental.
La unidad básica es un documento.
Desnormalización: poner los datos de la forma más reducida posible.
El formato básico es un JSON.
La clave es un string y el valor el dato que queramos
La forma de guardar los datos de forma persistente es BSON ya que pesa menos.
Agility: dentro de una misma colección puedo tener documentos con formato distinto
El schema matter: puede ser rígido como en sql o no, se puede decidir.
No hay por qué decidir en la implementación de la BD el tipo de datos que se van a guardar. El tipo de
datos se almacenará según venga.
Wired Tiger es la librería que usa mongo para guardar los datos tanto en caché como en disco
persistente.
Trabaja sobre caché para acelerar las consultas.
El grabado de datos es atómico. Las operaciones de escritura en cualquier documento tienen que
reescribir todo, no vale rellenarlo a medias. Además, se bloquean las escrituras múltiples para asegurar
la persistencia y la concurrencia de los datos.
Todo se guarda en memoria en forma de árbol binario.
Los ficheros que están en la caché de wiredtiger están descomprimidos.
Journaling and checkpoint se aseguran de gestionar la memoria. Cada 60 seg se persiste la memoria
caché en el disco. (son ficheros independientes)
Journalist: se encarga de guardar lo que estoy gestionando en tiempo real en memoria caché. Cada 60
segundos lo que estás trabajando pasa a ser persistente gracias al checkpoint.
Cuando no indicas la cadena de conexión no incluye la bd crea una por defecto que es TEST y es virtual
59
LOS ARGUMENTOS SIEMPRE SON JSON
Show collections
Use nombre_db
Find(): muestra la colección
InsertOne({clave:valor})
InsertMany({clave:valor},{},{},…..) el guardado no es atómico, solo por cada elemento.
Find({clave:valor}) Busca el objeto
PROYECCIÓN: Find({clave:valor}, {_id:1, name:1, spend:1}) 🡪 solo devuelve el id, name y spend del filtro
(o todos a 1 o todos a 0, sino da error. Solo el _id se puede se puede poner a 0 o 1 indistintamente)
Basch o algo así es la cantidad de documentos que devuelve el servidor.
Operadores:
$or🡪 para el or hay que declararlo al principio de los argumentos y las opciones dentro de un array. No
se puede usar con $text
[Link]({$or[{clave:valor},{clave2:valor2}]})
Arrays:
En los arrays matchea aunque no pongas el array entero en la consulta.
$all 🡪 solo matchea si los elementos que están en la consulta están todos. No importa el orden.
60
$elemMatch🡪
INSERT
$set 🡪 para indicar el argumento a modificar en el insert
$unset🡪 hace desaparecer un campo del documento.
Hay que indicar el argumento true, -1 o “” para que borre el campo
$inc🡪 Incremento, suma y almacena (con número negativo resta)
$mul 🡪 Multiplicación y almacena (con número negativo divide)
$max//$min
replaceOne() apenas se usa porque gasta muchos recursos, reemplaza el documento completo. Es como
un delete() y un insert(). Lo pisa todo menos el _id.
Write Concerns – a cuantos nodos tengo que escribir para confirmar la escritura correcta.
W:0 – no confirmation
W:1 – confirmar cuando se escribe en el primario.
W:Majority – Confirmar al escribir en la mayoría de los nodos.
J:1 – Se puede poner en cualquiera de las anteriores para saltarse la etapa de checkpoint y escribir
directamente en disco, saltando la caché.
61
ARRAYS:
$size devuelve el tamaño de un array.
Cuando se quieren ordenar arrays dentro de una colleccion estos se ordenan por el valor de la primera
posición del array.
Los arrays dentro de arrays tienen consultas muy lentas ya que hay que recorrer todo el array. Hay que
modificar el diseño del documento para modificar el array embebido por un documento embebido que
contenga ese array.
products
$elemMatch
Operator
Use the
$elemMatch
62
operator to find all documents that contain the specified subdocument. For example:
[Link]({
items: {
$elemMatch: { name: "laptop", price: { $gt: 800 }, quantity:
{ $gte: 1 } },
},
})
Authentication:
Contraseña
Certificado de seguridad
biometría
Cada tipo de usuario tiene un nivel distinto de permisos. No deben compartir la forma de autenticarse.
OPSManager 🡪 para tu servidor propio. Los usuarios solo se pueden gestionar desde atlas.
OPSManager simple installation 🡪 video `para instalar el servidor
63
64
ENCRIPTACIÓN : (estudiar bien)
ON THE WIRE(NETWORK)
MongoDB admite TLS/SSL (Seguridad de la capa de transporte/Capa de sockets seguros)
para cifrar todo el tráfico de red de MongoDB. TLS/SSL garantiza que el tráfico de red
MongoDB solo sea legible por el cliente previsto.
AT REST (DISK)
El cifrado a nivel de disco en MongoDB se refiere al cifrado de datos en reposo en el disco.
Esta característica permite a MongoDB cifrar los archivos de datos almacenados en el
servidor de la base de datos, asegurando que solo las partes con la clave de descifrado
puedan decodificar y leer los datos. El cifrado a nivel de disco proporciona una capa
adicional de seguridad para proteger los datos confidenciales incluso si el medio de
almacenamiento físico está comprometido.
En ATLAS es obligatorio
Se puede duplicar dificultad añadiendo un encriptado doble a la clave del hash.
IN USE(Client)
Se define en el documento que campos están encriptados para guardarlo en BSON.
Solo se puede desencriptar con la clave y el algoritmo de desencriptación. No solo con user-password.
El cifrado de nivel de campo del lado del cliente (CSFLE) es una característica que le permite
cifrar datos en su aplicación antes de enviarlos a través de la red a MongoDB. Con CSFLE
habilitado, ningún producto MongoDB tiene acceso a sus datos sin cifrar.
65
66
Auditing
Normalmente se auditan las operaciones de administración y las fallidas ya que consume muchos
recursos.
Se audita todo lo que hace una persona, lo que viene de programadores y la administración de la base
de datos.
INTERNAL AUTHENTICATION
Todas las conexiones internas del replicaset se gestionan mediante certificados SCRAM-SHA o x.509
Nº de retornados, total examined y total keys tienen que ser lo más parecidos para que la base de datos
esté bien indexados.
El parámetro COLLSCAN(etapa de la consulta) indica que la query ha tenido que revisar toda la colección
por lo que se necesita un índice.-SOLO SE HA EJECUTADO ESTA ETAPA. ES LENTA Y OCUPA MUCHA RAM.
FECH e IXSCAN: indican que se ha mirado en un índice en la etapa IXSCAN y el fetch solo muestra lo que
indica el índice.
67
En el índice se indica el campo que va a ser el criterio de ordenación y más tarde 1 o -1 para indicar el
orden ascendente o descendente.
getIndexes()🡪 indica una lista de ínndices de la collection
Un índice solo puede hacerse cargo de la consulta si el comienzo del índice se encuentra en la sintaxis.
(prefijo). El prefijo puede aparecer en el .short() y también utilizará el índice.
Revisar el ratio entre el número de resultados y las claves examinadas. Tiene que estar lo más cerca
posible a 1 para que la query esté optimizada y no necesite revisar documentos que no son los correctos.
Si un mismo documento necesita varios index por que tiene varias consultas?
O se duplica la base de datos o se generan varios index. Depende del caso de uso.
MONITORIZACIÓN:
La terminal muestra las últimas 1024 entradas de Logs. En Atlas se puede acceder a los últimos meses.
68
Si una query tarda más de 100 milisegundos se da de alta un log para que aparezcan. Se puede
configurar y modificar
Existen tanto de gestión de la base como del funcionamiento interno.
[Link]({1, slows:20})
Se usa para modificar la forma en que se tratan las gestiones lentas.
0 no aparece ninguna.
1 depende del tiempo, slows: milisegundos.
2 todas
69
INDEXES
Los índices aceleran las queries. Reduce el uso de recursos.
El índice es una copia de parte del documento en otro espacio de memoria.
El _id lleva un índice implícito generado por el servidor de mongo que es _id_.
Primero las queryes y después los índices.
Se almacenan como árbol binario.
Todas las queries de lectura y update estarían soportadas por al menos un índice siempre que sea
posible.
ESR🡪 equality, short, Range para ordenar los índices y hacer las queries lo más eficientes posible.
Si tengo varios criterios de igualdad, todos al principio, Varios de ordenación, en el medio, y los de
rango, todos al final.
Es esperado si tengo criterios de ordenación y de rango en la misma query que el ratio no va a ser igual a
1. Con varios de rango, tampoco.
La ordenación del índice y la query tienen que ir todos en la misma dirección.
Query short({a:1, b:1}) 🡪 en el índice tienen que ir los dos argumentos a 1 o los dos a -1.
Más de 15 índices en una misma colección puede hacer que la app pete
Allowdiskused()🡪 ayuda a burlar el límite de 100 Mb en memoria para una consulta que lo necesite. La
primera clave del índice tiene que encontrarse dentro de la query para que esta use el índice.
70
Las queries se ordenan por prioridad, sobre todo dependiendo de las veces que se ejecutan. Las más
ejecutadas deben estar optimizadas, con un buen índice y las que tienen menos prioridad sacrificarlas y
adaptarlas al sistema para que se realicen sin entorpecer el normal funcionamiento de la BD.
El campo collation sirve para especificar la fuerza que tendrá la consulta, el número de coincidencias
erróneas que puede aceptar.
Índices WILDCARD:
Generan un índice sobre todas las propiedades del documento. Comodín, se usa únicamente cuando no
se sabe qué campos se esperan o si estos puedan cambiar.
Se usa el operador $** en el parámetro de la clave.
Índices PARTIAL:
Se utiliza para aplicar un filtro al índice. ($gt,<, $eq, etc…)
Se usa el elemento partialFilterExpression: {state:”CA” | state:{$lt…}} para indicar que use el
índice solo con el state “CA”o el state less than o la expresión que se indique.
[Link](
{ cuisine: 1, name: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
Si en la consulta no se incluye la clave del índice parcial (rating) no usa el índice ya que no devolvería
todos los resultados.
[Link](
{ cuisine: Italian})
no usa el índice por que no mostraría los restaurantes italianos menores a rating:5
Índices SPARSE:
Si queremos hacer un find en una clave concreta pero esta no se encuentra en todos los documentos
este mostrará los que no lo tengan al final de la lista. Este índice se usa solo en los documentos en los
71
que exista el campo indexado ignorando los documentos que no lo contengan. Si el campo está a null, si
que lo tiene en consideración, el campo si está creado.
Es una manera de disminuir la carga de la consulta. Todos los índices pueden ser SPARSE.
[Link]({Field:1}, {sparse:true})
72
Índices de cluster:
??????????????
Índices GeoSpatial:
se usa sobre documentos que representan un objeto con types: y coordinates:
se declara indicando “2dSphere” o “2d” en el argumento de ordenación al crear el índice.
createIndex({field:”2dSphere”})
Índice Multikey:
se crean al usar un documento que contiene un array como clave del índice.
Rolling Index.
- Crear índices en modo Rolling se usa para que el nodo primario no esté generando el índice a la vez que
atiende consultas. De esta manera no se satura la máquina. Hay que tener en cuenta el tiempo del Oplog
para no perder los datos mientras un nodo está desconectado.
OpsManager, Atlass y compass lo hacen implícito. Sino, hay que configurarlo completo. Esto reduce el
downtime de la aplicación.
73
REPLICATION
Para sincronizar el replicaSet utiliza el algoritmo RAFT
Los 3 nodos son exactamente iguales. Solo cambian los roles. No pueden tener distintos tamaños.
Uno es primario otro secundario y el resto no-voting
El primario es el único que admite escritura y es este el que lo envía a los secundarios que están
escuchando. Existe un pequeño delay entre el primario y el resto. Las lecturas por defecto van al nodo
primario pero se puede modificar en el cliente.
Entre los nodos, al hacer las solicitudes de escritura se incluye la solicitud a [Link]. Esta incluye el
tiempo de la última actualización para saber hasta dónde hay que escribir la réplica.
Mongo tiene un servicio 24/7 y compromiso de respuesta en menos de 4 horas si lo tienes contratado.
Para que el replicaSet funcione correctamente se necesita tener levantados al menos la mayoría de los
nodos. Si se cae alguno, la otra mayoría se reestructura para no sufrir. Si el que se cae es el primario los
demás hacen la selección del nuevo primario. Durante esta selección, al no tener primario y ser este el
que recoge las operaciones de escritura, estas se ponen en cola. Si el que se cae es uno de los
secundarios, a través del [Link], se le indica al primario donde se cayó y poder recuperar la
información. De aquí que sea tan importante almacenar al menos 24 horas de [Link]. Si se pasa el
tiempo y no se puede recuperar a través del Log hay que replicar todo el nodo desde el primario ya que
no se puede recuperar la info. Todo esto a través de InitialSync()para que no se bloqueen y te quedes sin
nodo primario es recomendable tener siempre nodos impares.
Write Concerns – a cuantos nodos tengo que escribir para confirmar la escritura correcta.
74
si se ha escrito en la mayoría de los nodos. De esta manera se evita que se pierda la información al
realizar el ROLLBACK después de la caída de uno de los nodos.
W:0 – no confirmation
W:1 – confirmar cuando se escribe en el primario.
W:Majority – Confirmar al escribir en la mayoría de los nodos.
J:1 – Se puede poner en cualquiera de las anteriores para saltarse la etapa de checkpoint y escribir
directamente en disco, saltando la caché.
READ CONCERNS – cuanto tiene que replicarse el dato para poder leerlo.
Read preferences, se incluyen en la cadena de conexión para elegir el nodo en el que leer los datos.
Se suele usar para las queries de análisis.
Arbiter- nodo que forma parte del replicaSet pero no copia datos. No tiene datos. Hay que bajar el
writeconcerns a 0 porque sino si se cae una máquina se bloquean las operaciones de escritura al no
confirmarse la escritura.
75
Sharding
utiliza una instancia mongos
Es un mecanismo para paralelizar la base de datos. Particiona la base de datos en varios replicaset. Esta
partición puede ser vertical u horizontal.
O se tiene replicaset o shard. Se puede mudar de replicaset a shard pero no volver atrás.
Una máquina mongos actúa como enrutador entre los drivers de la aplicación, el servidor de
configuración (Replicaset de metadatos con las direcciones de memoria) y los servidores de shard. Se
aconseja que el MongoS tenga una alta RAM para poder atender las solicitudes. MongoS copia los
metadatos en caché y los va actualizando solo cuando se edita. Así se ahorran recursos.
Cuándo no:
Cuando no se alcancen ni se tenga previsión de alcanzar los límites.
76
No solo se particiona por la falta de recursos relacionados con el peso de la BD sino también por la carga
de operaciones. Ej: si tengo una consulta de inserción con 1000 documentos se puede repartir la carga
aunque siempre es mejor enviar las consultas a la misma colección en el mismo shard ya que sino el
mongo S tiene que comportarse como un enrutador y puede ralentizar la consulta.
Existe una herramienta encargada de balancear los shard con el criterio de que pesen igual cada uno de
ellos. Ese movimiento se hace en bloques de 128Mb. Puede modificarse se puede configurar en manual
y automático. Calcula la cantidad de datos en cada replicaset o shard y balancea la ecuación de reparto.
1.-Detecto que el shard se está llenando (384 Mb) . 2.-Se copia un bloque de 128 Mb en el segundo
shard y 3.-cuando cambia el índice en los metadatos del configserver, 4.-se borra el primer bloque de
128Mb.
No es aconsejable usarlo. Consume recursos. Mejor usarlo lo menos posible y por la noche.
El criterio de partición se indica en el servidor de config. Aquí indicamos donde se encuentran los datos.
Si no se indica en la query, el servidor de MongoS lo manda a todos los shard. (query en broadcast o
skatergater o algo así)
Buen uso:
-La mayoría de las operaciones van a un único shard.
El criterio de partición
–tiene que estar incluido en la mayoría de los documentos.
-Tener una alta cardinalidad.
-Suele ser compuesta. Aconsejable incluir fecha.
-la suma de los datos que coinciden con la misma clave de shard no superen los 128Mb.
Para declarar ,la clave de shard tiene que haber un index configurado previamente con los mismos
valores.
No se recomiendan claves crecientes o decrecientes como fechas, ya que sino todas las inserciones van a
ir al mismo shard.
77
BackUPs
MongoDump-
Solo se pueden hacer snapshot completos.
Mientras que empieza el snapshot se pierde el control de qué datos se pierden y cuáles no. Oplog –
Incluye una pausa en un secundario para que no se pierda la consistencia de los datos mientras se realiza
el snapshot.
MongoRestore-
FileSystem-
Directamente hago una copia de los datos. O bien de la máquina virtual o bien la carpeta de los datos.
Es el más rápido ya que la copia es física. Necesario hacer backup completo de todos los datos.
Cloud Manager-OpsManager-
Solo se comunican con agentes. De manera que no haya comunicación directa entre ellos.
Deploy
Monitor
Backup
Scale
Built and supported by mongo.
Ops permite hacer backups incrementales. Permite un control más exacto y no solo un snapshot. La
única base de datos que hay que actualizar manualmente, aunque no requiere de mucho
mantenimiento es la que soporta OpsManager.
78
Snapshot:
hay que bloquear la bd para escritura(fsynclock), realizar el snapshot y volver a activar la
bd(fsyncUnlock).
/var/lib/Mongodb
/dev
ZERO-DOWNTIME
Mi base de datos siempre está disponible. Mi aplicación no se puede parar.
Solo hay downtime en el caso que modifique la seguridad y añada el protocolo TLS.
Rolling Index.
- Crear índices en modo Rolling se usa para que el nodo primario no esté generando el índice a la vez que
atiende consultas. De esta manera no se satura la máquina. Hay que tener en cuenta el tiempo del Oplog
para no perder los datos mientras un nodo está desconectado.
OpsManager, Atlass y compass lo hacen implícito. Sino, hay que configurarlo completo. Esto reduce el
downtime de la aplicación.
MongoD- Servidor de mongodb. Si comunica el ops o cloud con el mongoD: automatización. Al contrario
es Monitorización.
wiretigercachesizeGb el advanced Options restringe la cantidad de caché que se usa por cada nodo.
Siempre que se crea un agente hay que configurar y activar la monitorización en servers.
Si estamos en local los tres replicaset no pueden estar en la misma carpeta. Es necesario una para cada
uno.
79
ACTUALIZAR MONGODB
80
MÉTRICAS:
Scan and Orders: Aparecen los colScan y las ordenaciones en memoria.
La seguridad para que un proceso evite el OMKiller y no pete la máquina ni el SO mate el proceso se
configura la memoria RAM x/2-1Gb
La replicación de los nodos es en tiempo real mientras que cada uno tiene sus procesos independientes
para el journalist y el checkpoint.
Al poner el $ delante del nombre de una variable indica que queremos el valor de esa propiedad.
[Link] para Linux y Unix; [Link] para Windows. Luego se usa get y set para cambiar los
valores. .Reset
.[Link] 🡪 es un fichero oculto que se encuentra en la carpeta del usuario y podemos incluir
métodos y funciones para utilizar en nuestra terminal. Es un fichero oculto para protegerlo de ataques
de código malicioso, se ejecuta directamente en la consola.
La API fs (fileSistem) 🡪 está integrado en mongosh para leer y escribir ficheros. Da acceso a ficheros
Input, Output.
81
wtiteFileSync()
.stringify() 🡪 pasa de JSON a String mediante la clase EJSON().
[Link]() 🡪 pasa un fichero de string a JSON.
Require() 🡪
Opciones:
Absert 🡪 (si no encuentra el original, igualmente guarda la información).(hay que tener cuidado con las
duplicidades y controlarlas con un índice que lo respalde, que sea UNIQUE.
Hint() 🡪 para indicar el índice que nos interesa usar. Puedes indicar el hint tanto por el nombre como por
la descripción.
82
La opción 'rol index' permite crear índices de manera que el nodo primario no los genere simultáneamente mientras atiende consultas, evitando la saturación del nodo y reduciendo el downtime de la aplicación . Esto es esencial en entornos de producción para mantener el rendimiento constante del nodo primario durante operaciones críticas, asegurando que el ajuste de índices no interfiera con la capacidad de respuesta del sistema .
Las colecciones de series temporales en MongoDB están diseñadas para mejorar la eficiencia en el manejo de grandes volúmenes de datos que deben ser ordenados cronológicamente, utilizando índices optimizados que facilitan operaciones como la agregación y consulta . Sin embargo, no es posible crear estas colecciones como "capped" (limitadas), lo que impone limitaciones en la administración automática de espacio cuando los datos alcanzan ciertos límites .
Los índices Sparse solo indexan los documentos que contienen el campo especificado, ignorando aquellos donde el campo no existe, lo cual reduce la carga de consultas . Por otro lado, los índices TTL (Time To Live) son utilizados para eliminar documentos automáticamente después de un tiempo especificado, ideal para datos efímeros o temporales . Utilizar Sparse es beneficioso cuando se busca reducir espacio y mejorar el performance para consultas de campos opcionales, mientras que TTL es perfecto para gestionar datos volátiles como sesiones o logs temporales.
Las transacciones ACID en MongoDB permiten agrupar múltiples operaciones en una sola transacción, garantizando la integridad de los datos a nivel de documento. Esto es beneficioso para mantener la consistencia durante actualizaciones complejas. En comparación, las bases de datos RDBMS también soportan transacciones ACID, pero su implementación puede ser más robusta a nivel de múltiples tablas o registros debido a la estructura de los datos .
MongoDB optimiza las operaciones de lectura y escritura a través de la réplica en un replicaSet, donde el nodo primario recibe las escrituras y las replica a los secundarios para asegurar la disponibilidad de los datos . El algoritmo RAFT es crucial ya que facilita el consenso entre nodos para la elección de un nuevo nodo primario en caso de fallo, asegurando la continuidad del servicio sin pérdida de información .
El operador $elemMatch en MongoDB se utiliza para encontrar documentos que contengan un subdocumento que cumpla con todas las condiciones especificadas. Esto asegura que solo se devuelvan los documentos en los que al menos un subdocumento coincide con todos los criterios del $elemMatch, garantizando la exactitud en el filtrado de datos .
El uso de opciones de concerns de escritura (write concerns) permite especificar cuántos nodos deben confirmar una escritura antes de que esta sea considerada exitosa, afectando así la consistencia y la pérdida de datos. Por ejemplo, establecer W:Majority asegura que la escritura sea confirmada por la mayoría de los nodos . Las opciones de concerns de lectura (read concerns) determinan la consistencia de las lecturas respecto al registro de las operaciones; un higher read concern puede resultar en mayor latencia pero mayor consistencia .
La fragmentación en MongoDB permite distribuir los datos de una colección en múltiples servidores denominados "shards". Esto permite que MongoDB maneje grandes volúmenes de datos y cargas de trabajo intensivas, distribuyendo la carga entre los shards . El componente 'mongos' actúa como interfaz entre las aplicaciones cliente y el clúster fragmentado, recepcionando consultas y enroutándolas al shard adecuado para obtener los resultados .
Mongo Shell (mongosh) es una interfaz de línea de comandos que proporciona acceso directo a las bases de datos MongoDB para realizar tareas administrativas y ejecuta scripts . Compass es una aplicación de escritorio que ofrece una interfaz gráfica para interactuar y administrar bases de datos MongoDB, ideal para usuarios que prefieren visualizaciones . Atlas es un servicio en la nube que proporciona acceso y administración de bases de datos MongoDB a escala, permitiendo implementaciones sin configurar infraestructura local .
Las claves de shard crecientes o decrecientes, como las fechas, no se recomiendan porque pueden generar desbalanceo de carga entre los shards, ya que todas las inserciones se dirigen al mismo shard hasta que el valor cambia . Esto puede llevar a un sobrecarga en ese shard específico y potencialmente a un cuello de botella en las operaciones de escritura .