Guía Completa de MongoDB: Comandos y CRUD
Guía Completa de MongoDB: Comandos y CRUD
INSTRUCCIONES DE INSTALACIÓN:
- Ejecutar dos consolas cmd como administrador. La primera nos permite poner en
funcionamiento la BD con el comando "mongod". La segunda nos permite interactuar con
la BD a traves del Shell con el comando "mongo".
COMANDOS
1
help connect: connecting to a db help
show profile: show most recent system.profile entries with time >= 1ms
show log [name] : prints out the last segment of log in memory, 'global' is default
COMANDOS CRUD
Create
db.<nombre_collection>.insert(<json_object>)
Ejemplo:
db.products.insert(
{"name":"monitor",
"precio":165,
"active":true,
"tags":["computers","gaming","techno"]
2
)
db.<nombre_collection>.insertOne(<json_object>)
Ejemplo:
db.grades.insertOne(
student_id: 654321,
class_id: 550,
db.<nombre_collection>.insertMany(<json_object>,<json_object>)
Ejemplo:
db.grades.insertMany( [
student_id: 654321,
class_id: 550,
},
student_id: 224331,
3
products: [{ type: "homework", score: 80 }, { type: "quiz", score: 85 } ],
class_id: 551,
])
db.<nombre_collection>.find()
Ejemplo:
db.products.find()
db.<nombre_collection>.find(<parametro/s a buscar>)
Ejemplo:
db.products.find({"name":"laptop","precio":442.5})
Ejemplos:
db.products.find().limit(10).sort({"precio":1})
db.products.find({"name":"laptop"}).limit(3).sort({"precio":-1}).pretty()
Read - Operadores
$in - Selecciona documentos en los que el valor de un campo sea igual a cualquier
valor de la matriz especificada.
Ejemplo:
4
db.zips.find({ city: { $in: ["PHOENIX", "CHICAGO"] } })
$gt - Hace coincidir documentos con un campo mayor que el valor dado.
Ejemplo:
$lt - Hace coincidir documentos con un campo menor que el valor dado.
Ejemplo:
$gte - Hace coincidir documentos con un campo mayor o igual que el valor dado.
Ejemplo:
$lte - Hace coincidir documentos con un campo menor o igual que el valor dado.
Ejemplo:
Ejemplo:
db.sales.find({
items: {
},
})
$or - Para seleccionar documentos que coincidan con al menos una de las
expresiones incluidas.
Ejemplo:
db.routes.find({
5
})
$and- Para seleccionar documentos que coincidan con varias expresiones con $and
implícito.
Ejemplo:
Ejemplo:
db.routes.find({
$and: [
})
Las funciones find() nos permiten especificar como queremos que nos muestre los
resultados de la busqueda. Podemos pasarle como segundo argumento un documento con
los campos que queremos que se vean (asignandoles 1), de forma implicita nos muestra 2l
_id pero podemos especificar que no queremos verlo (asignandole 0).
Ejemplo:
db.companies.find(
{ category_code:"music" }, Busqueda
db.<nombre_collection>
.update(<parametro/s a buscar>,<json_object_sustituticion>)
Ejemplo:
6
db.products.update(
{"name":"keyboard"},
"name":"keyboard",
"precio":89.99,
"active":true,
"tags":["computers","gaming","techno"]
Update - Parametro
db.<nombre_collection>.
Ejemplo:
db.products
.update(
{"name":"desktop"},
{$set:
{"description":"Gaming Desktop"}
db.products
.update(
{"name":"desktop"},
{$set:
{"description":"Gaming Desktop"}
7
},
{upsert:true}
db.<nombre_collection>
Ejemplo:
db.products.update({"name":"keyboard"},{$inc:{"precio":0.01}})
db.<nombre_collection>
Ejemplo:
db.products.update({"name":"keyboard"},{$rename:{"precio":"prize"}})
Delete
db.<nombre_collection>.remove(<parametro/s a buscar>)
Ejemplo:
db.products.remove({"name":"monitor"})
db.products.remove({})
AGGREGATE
Etapa : uno de los métodos integrados que se puede completar en los datos, pero
no los altera de forma permanente.
8
Tubería de agregación : una serie de etapas completadas en los datos
db.collection.aggregate([
$stage1: {
{ expression1 },
{ expression2 }...
},
$stage2: {
{ expression1 }...
])
$match - La etapa filtra los documentos que coinciden con las condiciones especificadas.
Ejemplo:
$match: {
"field_name": "value"
Ejemplo:
$group:
9
<field>: { <accumulator> : <expression> }
db.zips.aggregate([
$match: {
state: "CA"
},
$group: {
_id: "$city",
totalZips: { $count : { } }
])
$sort - Clasifica todos los documentos de entrada y los devuelve a la canalización en orden
ordenado. Usamos 1 para representar el orden ascendente y -1 para representar el
orden descendente.
Ejemplo:
$sort: {
"field_name": 1
10
}
Ejemplo:
$limit: 5
db.zips.aggregate([
$sort: {
pop: -1
},
$limit: 5
])
$project - Especifica los campos de los documentos de salida. 1 significa que el campo
debe incluirse y 0 significa que el campo debe suprimirse. Al campo también se le
puede asignar un nuevo valor.
Ejemplo:
$project: {
state:1,
11
zip:1,
population:"$pop",
_id:0
Ejemplo:
$count: "total_zips"
$set - Crea nuevos campos o cambia el valor de los campos existentes y luego genera los
documentos con los nuevos campos.
Ejemplo:
$set: {
place: {
$concat:["$city",",","$state"]
},
pop:10000
$out - Graba los documentos devueltos por un conducto de agregación en una nueva
colección. Debe ser la última etapa.
Ejemplo:
db.zips.aggregate([
12
$group: {
_id:"$state"
},
},
$out: "small_states"
])
INDEXES
Los indices son estructuras de datos especiales que almacenan una pequeña parte de los
datos de colecciones en una forma ordenada que es fácil de recorrer y buscar de forma
eficiente. Apuntan a la identidad del documento y le permiten buscar, acceder y actualizar
datos más rapidamente. Se utilizan para mejorar el rendimiento de las consultas,
acelerandolas, reduciendo la entrada/salida en disco y reduciendo los recursos necesarios
para ello.
Use createIndex() para crear un nuevo índice en una colección. Dentro de los paréntesis de
createIndex(), incluya un objeto que contenga el campo y el orden de clasificación.
Ejemplo:
db.customers.createIndex({
birthdate: 1
})
13
índice fallará.
Ejemplo:
db.customers.createIndex(
email: 1
},
unique:true
MongoDB solo crea el índice único si no hay duplicación en los valores de campo para
el/los campo/s de índice.
Use getIndexes() para ver todos los índices creados en una colección.
Ejemplo:
db.customers.getIndexes()
Use explain() en una colección cuando ejecute una consulta para ver el plan de ejecución.
Este plan proporciona los detalles de las etapas de ejecución (IXSCAN, COLLSCAN, FETCH,
SORT, etc.).
⦁ La etapa IXSCAN indica que la consulta está utilizando un índice y qué índice se
está seleccionando.
Ejemplos:
db.customers.explain().find({
14
birthdate: {
$gt:ISODate("1995-08-01")
db.customers.explain().find({
birthdate: {
$gt:ISODate("1995-08-01")
}).sort({
email:1
Use createIndex() para crear un nuevo índice en una colección. Incluya un objeto como
parámetro que contenga el campo de matriz y el orden de clasificación. En este ejemplo
accounts es un campo de matriz.
Ejemplo:
db.customers.createIndex({
accounts: 1
})
Úselo createIndex() para crear un nuevo índice en una colección. Dentro de los paréntesis
de createIndex(), incluya un objeto que contenga dos o más campos y su orden de
clasificación.
15
Ejemplo:
db.customers.createIndex({
active:1,
birthdate:-1,
name:1
⦁ Igualdad: campo/s que coincide con un solo valor de campo en una consulta
Ejemplo de consulta:
db.customers.find({
birthdate: {
$gte:ISODate("1977-01-01")
},
active:true
}).sort({
birthdate:-1,
name:1
})
16
db.customers.createIndex({
active:1,
birthdate:-1,
name:1
})
Un índice cubre una consulta cuando MongoDB no necesita obtener los datos de la
memoria, ya que el índice ya devuelve todos los datos necesarios.
En la mayoría de los casos, podemos usar proyecciones para devolver solo los campos
obligatorios y cubrir la consulta. Asegúrese de que esos campos en la proyección estén en
el índice.
Ejemplo:
db.customers.explain().find({
birthdate: {
$gte:ISODate("1977-01-01")
},
active:true
},
{name:1,
birthdate:1,
_id:0
}).sort({
17
birthdate:-1,
name:1
})
Eliminar un índice
Úselo dropIndex() para eliminar un índice existente de una colección. Dentro de los
paréntesis de dropIndex(), incluya un objeto que represente la clave del índice o
proporcione el nombre del índice como una cadena.
db.customers.dropIndex(
'active_1_birthdate_-1_name_1'
db.customers.dropIndex({
active:1,
birthdate:-1,
name:1
})
Eliminar índices
Úselo dropIndexes()para eliminar todos los índices de una colección, con la excepción del
índice predeterminado en _id.
Ejemplo:
db.customers.dropIndexes()
El comando dropIndexes() también puede aceptar una matriz de nombres de índice como
parámetro para eliminar una lista específica de índices.
Ejemplo:
db.collection.dropIndexes([
])
18
MODELADO DE DATOS
TRANSACCIONES
ACID Compliant:
⦁ Atomicidad: Si cuando una operación consiste en una serie de pasos, de los que o
bien se ejecutan todos o ninguno, es decir, las transacciones son completas.
⦁ Aislamiento: Esta propiedad asegura que una operación no puede afectar a otras.
Esto asegura que la realización de dos transacciones sobre la misma información
sean independientes y no generen ningún tipo de error. Esta propiedad define cómo
y cuándo los cambios producidos por una operación se hacen visibles para las
demás operaciones concurrentes. El aislamiento puede alcanzarse en distintos
niveles, siendo el parámetro esencial a la hora de seleccionar SGBDs.
19
esta forma los datos sobrevivan de alguna manera.
Las transacciones ACID en MongoDB generalmente se usan solo por aplicaciones donde los
valores se intercambian entre diferentes partes, como aplicaciones bancarias o comerciales.
Si se encuentra en un escenario donde se requiere una transacción de varios documentos,
es muy probable que complete una transacción con uno de los controladores de MongoDB.
Por ahora, concentrémonos en completar y cancelar transacciones de varios documentos en
el shell para familiarizarnos con los pasos.
Aquí hay un resumen del código que se usa para completar una transacción de varios
documentos:
Aquí hay un resumen del código que se usa para cancelar una transacción antes de que se
complete:
session.startTransaction()
20
account.insertOne({
account_id: "MDB454252264",
account_type: "savings",
balance: 100.0,
transfers_complete: [],
})
session.commitTransaction()
session.startTransaction()
session.abortTransaction()
MONGOD
mongod --help
Este comando generará las diversas opciones para mongod con una descripción de su
funcionalidad.
El dbpath es el directorio donde se almacenan todos los archivos de datos para su base de
datos. El dbpath también contiene registros de diario para brindar durabilidad en caso de un
21
bloqueo. Como vimos antes, el dbpath predeterminado es /data/db; sin embargo, puede
especificar cualquier directorio que exista en su máquina. El directorio debe tener permisos
de lectura/escritura ya que la base de datos y los archivos de diario se escribirán en el
directorio. Para usar la opción dbpath, incluya el indicador dbpath y especifique el nombre
de su directorio:
puerto
La opción de puerto nos permite especificar el puerto en el que mongod escuchará las
conexiones de los clientes. Si no especificamos un puerto, el valor predeterminado será
27017. Los clientes de la base de datos deben especificar el mismo puerto para conectarse a
mongod. Para especificar un puerto, ejecute:
autenticación
auth permite la autenticación para controlar qué usuarios pueden acceder a la base de
datos. Cuando se especifica la autenticación, todos los clientes de la base de datos que
deseen conectarse a mongod primero deben autenticarse.
Antes de que se haya configurado cualquier usuario de la base de datos, un shell de Mongo
que se ejecuta en localhost tendrá acceso a la base de datos. Luego podemos configurar
usuarios y sus niveles de permiso usando el shell. Una vez que se hayan configurado uno o
más usuarios, el shell ya no tendrá acceso predeterminado. Para habilitar la autenticación,
ejecute mongod con la opción auth:
mongod --auth
vincular_ip
La opción bind_ip nos permite especificar a qué direcciones IP debe vincularse mongod.
Cuando mongod se vincula a una dirección IP, los clientes de esa dirección pueden
conectarse a mongod. Por ejemplo, si quisiéramos permitir que los clientes con la dirección
IP 123.123.123.123 accedan a nuestra base de datos, usaríamos el siguiente comando:
Para enlazar a múltiples direcciones y/o hosts, puede especificarlos en una lista separada
por comas:
22
credenciales adecuadas.
Para obtener documentación sobre todas las opciones de mongod, consulte la página de
referencia de mongod.
https://www.mongodb.com/docs/manual/reference/program/mongod/
Instrucciones de lectura
https://www.mongodb.com/docs/manual/reference/configuration-options/
mongod
Tenga en cuenta que todas las opciones de "ssl" se han editado para usar "tls" en su lugar. A
partir de MongoDB 4.2, las opciones que usan "ssl" han quedado obsoletas.
storage:
dbPath: "/data/db"
systemLog:
23
path: "/data/log/mongod.log"
destination: "file"
replication:
replSetName: M103
net:
bindIp : "127.0.0.1,192.168.103.100"
tls:
mode: "requireTLS"
certificateKeyFile: "/etc/tls/tls.pem"
CAFile: "/etc/tls/TLSCA.pem"
security:
keyFile: "/data/keyfile"
processManagement:
fork: true
Instrucciones de lectura
ls -l /data/db
ls -l /data/db/diagnostic.data
ls -l /data/db/journal
ls /tmp/mongodb-27017.sock
24
Instrucciones de lectura
db.createUser()
db.dropUser()
db.<collection>.renameCollection()
db.<collection>.createIndex()
db.<collection>.drop()
db.dropDatabase()
db.createCollection()
db.serverStatus()
db.runCommand({
"createIndexes":"<collection_name>",
"indexes":[
"key":{ "product": 1 },
25
"name": "name_index"
db.<collection>.createIndex(
{ "product": 1 },
{ "name": "name_index" }
db.<collection>.createIndex
Instrucciones de lectura
db.getLogComponents() '
tail -f /data/db/mongod.log
Actualizar un documento:
26
Busque instrucciones en el archivo de registro con grep:
Instrucciones de lectura
Para enumerar todos los nombres de las colecciones, puede ejecutar este comando:
db.runCommand({listCollections: 1})
Mostrar colecciones:
Establecer ralentizaciones a 0:
Instrucciones de lectura
cat /etc/mongod.conf
27
Lanzar mongod independiente:
mongod -f /etc/mongod.conf
Conéctese a mongod:
use admin
db.createUser({
user: "root",
pwd: "root123",
roles : [ "root" ]
})
db.stats()
Apague el servidor:
use admin
db.shutdownServer()
Instrucciones de lectura
db.createUser(
{ user: "security_officer",
pwd: "h3ll0th3r3",
28
}
db.createUser(
{ user: "dba",
pwd: "c1lynd3rs",
Instrucciones de lectura 0
mkdir -p ~/first_mongod
mongostat --help
mongodump --help
29
ls dump/applicationData/
cat dump/applicationData/products.metadata.json
Use mongorestore para restaurar una colección MongoDB desde un volcado BSON:
Use mongoexport para exportar una colección MongoDB a JSON o CSV (¡o stdout!):
mongoexport --help
tail products.json
Use mongoimport para crear una colección MongoDB a partir de un archivo JSON o CSV:
REPLICACIÓN
Instrucciones de lectura 0
storage:
dbPath: /var/mongodb/db/node1
net:
bindIp: 192.168.103.100,localhost
port: 27011
security:
authorization: enabled
keyFile: /var/mongodb/pki/m103-keyfile
systemLog:
destination: file
30
path: /var/mongodb/db/node1/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-example
mkdir -p /var/mongodb/db/node1
mongod -f node1.conf
cp node1.conf node2.conf
cp node2.conf node3.conf
vi node2.conf
:wq
storage:
dbPath: /var/mongodb/db/node2
net:
31
bindIp: 192.168.103.100,localhost
port: 27012
security:
keyFile: /var/mongodb/pki/m103-keyfile
systemLog:
destination: file
path: /var/mongodb/db/node2/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-example
storage:
dbPath: /var/mongodb/db/node3
net:
bindIp: 192.168.103.100,localhost
port: 27013
security:
keyFile: /var/mongodb/pki/m103-keyfile
systemLog:
destination: file
path: /var/mongodb/db/node3/mongod.log
logAppend: true
processManagement:
fork: true
32
replication:
replSetName: m103-example
mkdir /var/mongodb/db/{node2,node3}
mongod -f node2.conf
mongod -f node3.conf
Conectando al nodo1 :
rs.initiate()
Creando un usuario:
use admin
db.createUser({
user: "m103-admin",
pwd: "m103-pass",
roles: [
})
exit
rs.status()
33
Adición de otros miembros al conjunto de réplicas:
rs.add("m103:27012")
rs.add("m103:27013")
rs.isMaster()
rs.stepDown()
rs.isMaster()
rs.serverStatus()['repl']
Nos ofrece información del log de operaciones (oplog) del nodo en el que estamos
conectados:
rs.printReplicationInfo()
REPLICACIÓN: Práctica
Instrucciones de lectura 1
mkdir allbymyselfdb
Mostrar todas las bases de datos (por defecto, solo administrador y local ):
mongo
show dbs
Mostrar colecciones de la base de datos local (esto muestra más colecciones de un conjunto
de réplicas que de un nodo independiente):
use local
show collections
34
use local
db.oplog.rs.find()
Verifique que esta colección esté limitada (crecerá a un tamaño preconfigurado antes de
que comience a sobrescribir las entradas más antiguas con las más nuevas):
stats.capped
stats.size
stats.maxSize
Obtenga datos de registro de operación actuales (incluidos los tiempos del primer y último
evento, y el tamaño de registro de operación configurado):
rs.printReplicationInfo()
Instrucciones de lectura 2
use m103
db.createCollection('messages')
Consulta el registro de operaciones, filtrando los latidos del corazón ("noop periódico") y
solo devolviendo la última entrada:
use local
use m103
for ( i=0; i< 100; i++) { db.messages.insert( { 'msg': 'not yet', _id: i } ) }
35
db.messages.count()
Consulta el registro de operaciones para encontrar todas las operaciones relacionadas con
m103.messages:
use local
Ilustre que una declaración de actualización puede generar muchas entradas en el registro
de operaciones:
use m103
use local
Recuerde, aunque puede escribir datos en la base de datos local, no debe hacerlo.
Instrucciones de lectura 3
nodo4.conf:
storage:
dbPath: /var/mongodb/db/node4
net:
bindIp: 192.168.103.100,localhost
port: 27014
systemLog:
destination: file
path: /var/mongodb/db/node4/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-example
36
árbitro.conf:
storage:
dbPath: /var/mongodb/db/arbiter
net:
bindIp: 192.168.103.100,localhost
port: 28000
systemLog:
destination: file
path: /var/mongodb/db/arbiter/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-example
mongod -f node4.conf
mongod -f arbiter.conf
rs.add("m103:27014")
rs.addArb("m103:28000")
rs.isMaster()
rs.remove("m103:28000")
Asignando la configuración actual a una variable de shell que podemos editar, para
37
reconfigurar el conjunto de réplicas:
cfg = rs.conf()
cfg.members[3].votes = 0
cfg.members[3].hidden = true
cfg.members[3].priority = 0
rs.reconfig(cfg)
Instrucciones de lectura 4
rs.isMaster()
use newDB
--authenticationDatabase "admin"
show dbs
rs.slaveOk()
38
use newDB
db.new_collection.find()
Intentar escribir datos directamente en un nodo secundario (esto debería fallar, porque no
podemos escribir datos directamente en un nodo secundario):
use admin
db.shutdownServer()
--authenticationDatabase "admin"
rs.isMaster()
Instrucciones de lectura 5
cfg = rs.conf()
cfg.members[2].priority = 0
rs.reconfig(cfg)
rs.isMaster()
Forzar una elección en este conjunto de réplicas (aunque en este caso, manipulamos la
elección para que solo un nodo pudiera convertirse en primario):
rs.stepDown()
39
rs.isMaster()
FRAGMENTACIÓN
Instrucciones de lectura
sharding:
clusterRole: configsvr
replication:
replSetName: m103-csrs
security:
keyFile: /var/mongodb/pki/m103-keyfile
net:
bindIp: localhost,192.168.103.100
port: 26001
systemLog:
destination: file
path: /var/mongodb/db/csrs1.log
logAppend: true
processManagement:
fork: true
storage:
dbPath: /var/mongodb/db/csrs1
csrs_2.conf:
sharding:
clusterRole: configsvr
40
replication:
replSetName: m103-csrs
security:
keyFile: /var/mongodb/pki/m103-keyfile
net:
bindIp: localhost,192.168.103.100
port: 26002
systemLog:
destination: file
path: /var/mongodb/db/csrs2.log
logAppend: true
processManagement:
fork: true
storage:
dbPath: /var/mongodb/db/csrs2
csrs_3.conf:
sharding:
clusterRole: configsvr
replication:
replSetName: m103-csrs
security:
keyFile: /var/mongodb/pki/m103-keyfile
net:
bindIp: localhost,192.168.103.100
port: 26003
systemLog:
41
destination: file
path: /var/mongodb/db/csrs3.log
logAppend: true
processManagement:
fork: true
storage:
dbPath: /var/mongodb/db/csrs3
mongod -f csrs_1.conf
mongod -f csrs_2.conf
mongod -f csrs_3.conf
Iniciando el CSRS:
rs.initiate()
use admin
db.createUser({
user: "m103-admin",
pwd: "m103-pass",
roles: [
})
db.auth("m103-admin", "m103-pass")
42
Agregue el segundo y tercer nodo al CSRS:
rs.add("192.168.103.100:26002")
rs.add("192.168.103.100:26003")
sharding:
configDB: m103-
csrs/192.168.103.100:26001,192.168.103.100:26002,192.168.103.100:26003
security:
keyFile: /var/mongodb/pki/m103-keyfile
net:
bindIp: localhost,192.168.103.100
port: 26000
systemLog:
destination: file
path: /var/mongodb/db/mongos.log
logAppend: true
processManagement:
fork: true
mongos -f mongos.conf
Conéctate a mongos:
sharding:
43
clusterRole: shardsvr
storage:
dbPath: /var/mongodb/db/node1
wiredTiger:
engineConfig:
cacheSizeGB: .1
net:
bindIp: 192.168.103.100,localhost
port: 27011
security:
keyFile: /var/mongodb/pki/m103-keyfile
systemLog:
destination: file
path: /var/mongodb/db/node1/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-repl
sharding:
clusterRole: shardsvr
storage:
dbPath: /var/mongodb/db/node2
wiredTiger:
engineConfig:
44
cacheSizeGB: .1
net:
bindIp: 192.168.103.100,localhost
port: 27012
security:
keyFile: /var/mongodb/pki/m103-keyfile
systemLog:
destination: file
path: /var/mongodb/db/node2/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-repl
sharding:
clusterRole: shardsvr
storage:
dbPath: /var/mongodb/db/node3
wiredTiger:
engineConfig:
cacheSizeGB: .1
net:
bindIp: 192.168.103.100,localhost
port: 27013
security:
45
keyFile: /var/mongodb/pki/m103-keyfile
systemLog:
destination: file
path: /var/mongodb/db/node3/mongod.log
logAppend: true
processManagement:
fork: true
replication:
replSetName: m103-repl
Conexión directa al nodo secundario (tenga en cuenta que si se ha realizado una elección en
su conjunto de réplicas, el nodo especificado puede haberse convertido en principal):
Apagando el nodo:
use admin
db.shutdownServer()
mongod -f node2.conf
rs.stepDown()
sh.addShard("m103-repl/192.168.103.100:27012")
Instrucciones de lectura 2
Si desea explorar las colecciones en la base de datos de configuración, puede encontrar las
instrucciones aquí:
use config
46
Consulta config.bases de datos:
db.databases.find().pretty()
Consulta config.colecciones:
db.collections.find().pretty()
Consulta config.shards:
db.shards.find().pretty()
Consultar config.chunks:
db.chunks.find().pretty()
Consulta config.mongos:
db.mongos.find().pretty()
Instrucciones de lectura 3
Nota: A partir de MongoDB 4.2, los valores de la clave de fragmento son mutables, aunque
la clave de fragmento en sí misma es inmutable. Si está interesado, puede obtener más
información en la documentación de valores de clave de fragmento .
Si desea fragmentar una colección, puede encontrar instrucciones para crear una clave
fragmentada aquí:
use m103
show collections
sh.enableSharding("m103")
db.products.findOne()
47
db.products.createIndex( { "sku": 1 } )
sh.status()
FRECUENCIA - Se recomienda que los valores únicos tengan una baja frecuencia.
La función hash asigna un valor númerico a la clave de fragmentación. Esto permite que
datos no demasiado recomendable como fechas o marcas de tiempo (comentadas en el
apartado anterior) puedan usarse al disponer de un valor estable y único en el que
establecer su ubicación en un fragmento.
48
Nota: Las claves hash solo pueden basarse en datos únicos. Dicho de otra manera, no se
admiten arrays.
Los trozos es el número de datos admitido por un fragmento. Para establecer una buena
configuración de fragmentación es relevante que se tenga en cuenta la cardinalidad de la
clave de fragmento, que nos permitira una mejor división de los trozos. También hay otros
aspectos limitantes para los trozos:
TAMAÑO DEL TROZO (ChunkSize) - Por defecto MongoDB toma 64MB como fragmento
predeterminado, pero nosotros podemos modificarlo y establecerlo entre 1MB y 1024MB
(1GB).
Instrucciones de lectura
use config
show collections
db.chunks.findOne()
use config
sh.status()
EQUILIBRIO
49
la vez, asi que toma el número de fragmentos y el número de trozos que se puede migrar en
una ronda de equilibrio (balancer round) y los divide entre dos.
Inicie el equilibrador:
sh.startBalancer(timeout, interval)
Detener el equilibrador:
sh.stopBalancer(timeout, interval)
Habilitar/deshabilitar el balanceador:
sh.setBalancerState(boolean)
Cuando realizamos una consulta en un clúster fragmentado, primero se crea una lista de
fragmentos objetivos para orientar la consulta, las consultas se realizan en cada fragmento y
posteriormente se fusionan para ofrecernos un único conjunto de resultados.
Compartamiento de métodos:
sort() - mongos aplica el criterio de ordenación a cada uno de los fragmentos antes
de la fusión.
limit() - mongos pasa el limite a cada uno de los fragmentos objetivos y reaplica el
limite una vez fusionado el conjunto de resultados.
Nota: Cuando se usa junto con limit(), los mongos pasarán el límite más el valor de skip() a
los fragmentos para garantizar que se devuelva una cantidad suficiente de documentos a los
mongos para aplicar el limit() y skip() exitosamente.
50
Consultas dirigidas VS Recopilación dispersa
Consulta dirigida - Cuando usamos la clave de fragmentación para realizar una consulta,
mongos se fija en una tabla donde figuran los datos de fragmentación, es decir, los rangos
en los que hemos dividido los datos en los distintos fragmentos. De esta forma se dirige al
fragmento correspondiente, haciendo que la consulta sea más rapida y eficiente.
Cuando utilizamos un indice compuesto como clave de fragmentación, se puede usar parte
o la totalidad de los datos como prefijo de la consulta y está se realizará de forma dirigida.
Siempre y cuando la realicemos teniendo en cuenta el orden de prioridad establecido.
Instrucciones de lectura
Una consulta find() en la que el predicado coincide con la clave de fragmento y la consulta
puede orientarse :
Una consulta find() donde el predicado no coincide con la clave de fragmento y la consulta
es una recopilación dispersa :
51
{ "sku": 1, "type": 1, "name": 1 }
Instrucciones de lectura 2
use m103
show collections
db.products.find( {
).explain()
Glosario:
1. Tabla
2. Tabla
52
4. El modelo de datos de relación de entidad
1. Base de datos
2. Esquema
53
Diagrama para modelado de rendimiento
54
Resumen de enfoque de modelado
Patrones
55
Patrón de atributo (Attribute Pattern)
ejemplo:
{"color":"blue","size":"large"}
{ specs: [
{"k":"color","v":"blue"},
{"k":"size","v":"large"}
]}
- Beneficios:
56
Nota: Esto también se puede hacer con Wildcard Index
db.collection.createIndex( { "specs.$**" : 1 } )
- Solución: Dividir la colección en dos colecciones (datos más usados y datos menos
usados), la división se usa con más frecuencia para las relaciones 1-M y M-M.
- Perjuicios: Más documentos para recuperar (más viajes de ida y vuelta), requiere
más espacio en el disco.
57
- Perjuicios: Puede ser dificil identificar la necesidad, evite aplicarlo o usarlo en
exceso a menos que sea necesario.
- Casos de uso: Internet de las cosas (IOT), almacén de datos, mucha información
asociada a un objeto.
- Casos de uso: Cada documento que utiliza una base de datos, desplegado en
producción y muy utilizado, sistema con una gran cantidad de datos heredados.
58
Beneficios: Navegación facil hacia los "nodos hijos" o patrones de
acceso de árbol descendente.
Otros patrones:
59
uso, identificar los campos atípicos como una excepción, ubicar las
excepciones en otro lugar dentro de la aplicación.
60
61
62
Conéctese a su clúster Atlas
1. Cree un nuevo archivo llamado Connection.java con el siguiente código. Este archivo
utiliza su cadena de conexión MongoDB y MongoClient para establecer una conexión con su
clúster Atlas:
package com.mongodb.quickstart;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.bson.Document;
import java.util.ArrayList;
import java.util.List;
63
databases.forEach(db -> System.out.println(db.toJson()));
2. En la carpeta raíz del proyecto, ejecute el siguiente comando para compilar su proyecto
Maven y conectarse a su clúster Atlas:
if (mongoClient == null) {
.applyConnectionString(connectionString)
.serverApi(ServerApi.builder()
.version(ServerApiVersion.V1)
.build()
).build();
return mongoClient;
64
65
usando $match y $group
Revise el siguiente código, que demuestra cómo crear las etapas y de una canalización de
agregación en MongoDB con Java. $match $group
$match y $group
En los dos ejemplos siguientes, usamos la clase Aggregates de constructor para crear las
etapas y de una canalización de agregattion. $match $group
Primero, usamos para encontrar una cuenta que pertenece a un cliente. Comenzamos
creando un nuevo método llamado que llamamos en el método principal. En, usamos la
clase de constructor para especificar qué cuenta estamos buscando. El método crea una
etapa de canalización que compara los documentos entrantes con el filtro de consulta
especificado y filtra los documentos que no coinciden.
66
$matchmatchStagematchStageFiltersmatch()$match
MongoDatabase db = mongoClient.getDatabase("bank");
matchStage(accounts);
accounts.aggregate(Arrays.asList(matchStage)).forEach(document->
System.out.print(document.toJson()));
En el siguiente ejemplo, usamos y para encontrar los saldos promedio y total de las cuentas
del cliente. Comenzamos creando un nuevo método llamado que llamamos en el método
principal. El método crea una etapa de canalización que compara los documentos entrantes
con el filtro de consulta especificado y filtra los documentos que no coinciden. Luego, el
método crea una etapa de canalización para agrupar documentos por una expresión
específica y generar un documento para cada agrupación distinta.$match
$groupmatchAndGroupStagesmatch()$matchgroup()$group
MongoDatabase db = mongoClient.getDatabase("bank");
matchAndGroupStages(accounts);
67
{
accounts.aggregate(Arrays.asList(matchStage,
groupStage)).forEach(document->System.out.print(document.toJson()));
Revise el siguiente código, que demuestra cómo crear las etapas $sorty $projectde una
canalización de agregación en MongoDB con Java.
$sort y $project
El método match() crea una etapa de canalización que compara los documentos entrantes
con el filtro de consulta especificado y filtra los documentos que no coinciden. Luego, el
método crea una etapa de canalización para ordenar según los criterios especificados.
Finalmente, el método crea una etapa de canalización que proyecta campos de documentos
específicos. La proyección de campo en la agregación sigue las mismas reglas que la
proyección de campo en las consultas.$matchsort()$sortproject()$project
MongoDatabase db = mongoClient.getDatabase("bank");
matchSortAndProjectStages(accounts);
68
Filters.eq("account_type", "checking")));
Bson projectStage =
Aggregates.project(Projections.fields(Projections.include("account_id",
"account_type", "balance"), Projections.computed("euro_balance", new
Document("$divide", asList("$balance", 1.20F))), Projections.excludeId()));
accounts.aggregate(asList(matchStage,sortStage,
projectStage)).forEach(document -> System.out.print(document.toJson()));
Revise el código siguiente, que muestra cómo insertar un solo documento y varios
documentos en una colección.
Insertar un documento
Dentro de los paréntesis de insertOne(), incluya un objeto que contenga los datos del
documento.
.append("id", "10021-2015-ENFO")
.append("certificate_number", 9278806)
.append("date", Date.from(LocalDate.of(2015, 2,
20).atStartOfDay(ZoneId.systemDefault()).toInstant()))
69
.append("address", new Document().append("city",
"RIDGEWOOD").append("zip", 11385).append("street", "MENAHAN
ST").append("number", 1712));
BsonValue id = result.getInsertedId();
System.out.println(id);
Dentro de los paréntesis de insertMany(), incluya un objeto que contenga los datos del
documento.
.append("account_holder","john doe")
.append("account_id","MDB99115881")
.append("balance",1785)
.append("account_type","checking");
.append("account_holder","jane doe")
.append("account_id","MDB79101843")
.append("balance",1468)
.append("account_type","checking");
result.getInsertedIds().forEach((x,y)-> System.out.println(y.asObjectId()));
Revise el siguiente código, que demuestra cómo consultar documentos en MongoDB con
70
Java.
Usando find()
En el siguiente ejemplo encontramos todas las cuentas que tienen un saldo mayor o igual a
1000 y son cuentas corrientes. Procesamos cada documento que devuelve el método find()
iterando MongoCursor. El método find() acepta un filtro de consulta y devuelve documentos
que coinciden con el filtro en la colección.
.iterator())
while(cursor.hasNext()) {
System.out.println(cursor.next().toJson());
Usando find().first()
Al encadenar los métodos find() y first() se encuentra el primer documento coincidente para
el filtro de consulta que se pasa al método find(). En el siguiente ejemplo, devolvemos un
solo documento de la misma consulta:
System.out.println(doc.toJson());
Revise el siguiente código, que demuestra cómo actualizar documentos en MongoDB con
Java.
Usando updateOne()
71
coincide con el filtro.
Bson updates =
Updates.combine(Updates.set("account_status","active"),Updates.inc("balance",
100));
Usando updateMany()
Revise el siguiente código, que demuestra cómo eliminar documentos en MongoDB con
Java.
Usando deleteOne()
72
Doe:
System.out.println("Deleted a document:");
System.out.println("\t" + delResult.getDeletedCount());
Para eliminar varios documentos de una colección en una sola operación, llamamos al
método deleteMany() en un objeto MongoCollection. Para especificar qué documentos
eliminar, pasamos un filtro de consulta que coincide con los documentos que queremos
eliminar. Si proporcionamos un documento vacío, MongoDB hace coincidir todos los
documentos de la colección y los elimina.
System.out.println(delResult.getDeletedCount());
Para eliminar varios documentos de una colección en una sola operación, llamamos al
método deleteMany() en un objeto MongoCollection. Para especificar qué documentos
eliminar, pasamos un filtro de consulta que coincide con los documentos que queremos
eliminar. Si proporcionamos un documento vacío, MongoDB hace coincidir todos los
documentos de la colección y los elimina.
System.out.println(delResult.getDeletedCount());
73
Creación de transacciones MongoDB en aplicaciones Java
Revise el siguiente código, que demuestra cómo crear transacciones de varios documentos
en MongoDB con Java.
8. Confirmar la transacción.
MongoCollection<Document> bankingCollection =
client.getDatabase("bank").getCollection("accounts");
};
try {
clientSession.withTransaction(txnBody);
System.out.println(e);
}finally{
clientSession.close();
75