0% encontró este documento útil (0 votos)
2 vistas1027 páginas

Java Mongo

El documento presenta una introducción a las bases de datos, destacando la evolución de SQL y las desventajas de su uso, como la complejidad y el costo. Se introduce MongoDB como una base de datos NoSQL que ofrece ventajas como escalabilidad y flexibilidad, además de describir sus tipos de datos y cómo se relacionan los documentos. También se discuten patrones de diseño y sentencias específicas de MongoDB, enfatizando su diferencia con SQL.

Cargado por

mrcoar
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas1027 páginas

Java Mongo

El documento presenta una introducción a las bases de datos, destacando la evolución de SQL y las desventajas de su uso, como la complejidad y el costo. Se introduce MongoDB como una base de datos NoSQL que ofrece ventajas como escalabilidad y flexibilidad, además de describir sus tipos de datos y cómo se relacionan los documentos. También se discuten patrones de diseño y sentencias específicas de MongoDB, enfatizando su diferencia con SQL.

Cargado por

mrcoar
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

JAVA + MONGODB

Marco Araneda Soto


Introducción
• Una base de datos es “una recopilación organizada de
información o datos estructurados, que normalmente se
almacena de forma electrónica en un sistema informático”
(fuente: [Link]
• Antiguamente, una base de datos consistía simplemente en uno o
varios archivos con información deseada, los cuales eran leídos
mediante operaciones de entrada y salida hasta encontrar el o los
registros correctos
• La gran desventaja en eso era el esfuerzo del programador para
buscar los registros deseados en un archivo.
Introducción
• En la década de 1970, IBM lanzó y utilizó por primera vez
un lenguaje dedicado a las consultas de registros en
bases de datos. Este lenguaje es conocido como SQL
(Structured Query Language)
• Este lenguaje, estandarizado durante la década de los 80,
permitió a varios programas creados en varios lenguajes
manipular una o varias bases de datos, sin importar
dónde estaban alojados, dependiendo exclusivamente
del programador saber con qué tablas y registros trabajar.
Introducción
• Sin embargo, trabajar con SQL posee las siguientes desventajas:
– Interfaz compleja: Debido a que el programador debe saber SQL para trabajar con bases de
datos, incluso en un programa cliente con interfaz gráfica el programador debe dominar las
palabras reservadas y las funciones
– Costo: No todas las bases de datos son gratuitas. Se sabe que MySQL y PostgreSQL, pero
algunas empresas, por necesidades del mercado, trabajan con bases de datos no gratuitas
como Oracle o SQL Server (aunque hay clientes gratuitos para todos ellos)
– Control parcial: Incluso como súper usuario, existen operaciones para los que un usuario de
base de datos no tiene el control absoluto.
– Con el paso del tiempo, se volvía cada vez menos flexible y rápido el uso de SQL para bases
de datos de gran envergadura.
– No todos los lenguajes de programación pueden trabajar con SQL. Se sabe que TypeScript y
JavaScript, y frameworks basados en éstos como NodeJs no pueden acceder directamente a
bases de datos SQL, sino que invocando a un Web Service desarrollado en un lenguaje que
sí pueda, como Java o PHP.
Introducción
• Una posible solución a todas estas desventajas es
trabajar con una base de datos NoSQL
PARTE 1: MongoDB
Base de datos NoSQL
• Una base de datos NoSQL es cualquier base de datos
que no es relacional (no se basa en tablas, registros en
tablas y relaciones entre tablas).
– Esto NO significa que NO se utilice lenguaje SQL para trabajar
con bases de datos NoSQL. De hecho, a veces definen NoSQL
como “Not only SQL” (“No solamente SQL”)
• Las bases de datos NoSQL existían desde antes de SQL,
pero el término NoSQL empezó a ser utilizado desde la
década del 2000
Ventajas de NoSQL sobre SQL
• Escalabilidad horizontal, es decir, en vez de migrar desde un servidor a otro para
incrementar la carga sobre este, se utilizan 2 o más servidores o nodos a la vez.
• No se limitan a tablas y filas para guardar o leer datos, al ser no relacionales.
• A diferencia de SQL, que obliga al uso de propiedades ACID (Atomicidad, Consistencia,
Aislamiento/”Isolation” y durabilidad), NoSQL obliga al uso de propiedades CAP
(Consistencia, Disponibilidad/”Availability” y Tolerancia a Particiones/”Partition Tolerance”),
aunque existen algunos motores de bases de datos NoSQL que también permiten las
propiedades ACID.
• Soporte para algunos lenguajes que no soportan conexiones con bases de datos SQL.
• Todas o casi todas las bases de datos NoSQL son OpenSource.
• En SQL existe una cadena compleja de dependencias, incluso para cambios triviales (por
ejemplo el uso de ALTER TABLE para agregar o quitar campos, agregar o quitar claves
primarias, agregar o quitar claves foráneas, agregar o quitar valores por defecto para una
columna, etc.)
Ventajas de SQL sobre NoSQL
• Poco soporte de NoSQL en comparación con SQL.
Tipos de bases de datos NoSQL
• Orientados a columnas. Aquí, cada registro es guardado en una
columna en vez de una fila.
• Almacenes clave-valor: Aquí, la base de datos es tratada como un
arreglo asociativo, diccionario o mapa, donde cada registro contiene un
identificador único para buscarlo, similar a las claves primarias en SQL.
• Almacenes de documentos. Aquí las bases de datos son conjuntos de
documentos que codifican datos en formatos estándar como XML,
YAML, JSON (Java Script Object Notation) y BSON (JSON binario)
• Bases de datos grafos. Aquí, una base de datos es un grafo
representando las relaciones entre distintos sets de datos.
MongoDB
• Es una base de datos NoSQL del tipo “Almacén de
Documentos” que utiliza el formato BSON para
representar datos.
• Para esta base de datos, la unidad básica de datos es un
simple documento.
• Uno o varios documentos pueden estar agrupados en
una colección
• Una base de datos está compuesta de una o más
colecciones.
MongoDB
• Aunque MongoDB utiliza BSON como el tipo de los documentos, permite
visualizar, filtrar, actualizar o insertar datos utilizando el formato JSON.
• En consecuencia, asumiendo puramente JSON, un simple documento:
– Puede tener uno o más campos con sus valores, en la forma “clave”: “valor”
– Un valor puede ser un string, un arreglo, un booleano, un número u otro objeto
en formato JSON.
• BSON, además, proporciona las siguientes extensiones
– Se agrega un tipo de dato especial llamado ObjectID, para representar el
identificador de un simple documento bajo la clave “_id”.
– Agrega más soporte para números
– Agrega soporte para fechas y algunos otros tipos de datos no soportados por
JSON.
Ejemplo de documento en MongoDB
Ventajas de documentos en MongoDB
• MongoDB permite documentos polimórficos, es decir, un
simple documento no tiene que tener exactamente la
misma estructura que los demás dentro de una misma
colección.
Limitaciones de documentos en MongoDB
• No permite claves primarias compuestas.
• No permite especificar el nombre de una clave primaria.
En MongoDB, cada documento tiene una clave primaria y
solo una, llamada “_id”.
• MongoDB no permite documentos sin el campo “_id”. En
consecuencia, si se intenta insertar un documento sin ese
campo, se creará automáticamente el campo con un
valor aleatorio del tipo ObjectID.
Relaciones entre documentos
• Uno a uno:
– Cada documento contiene solamente campos de tipos de datos
básicos aparte del campo “_id”
• Uno a muchos:
– Un documento contiene al menos un campo cuyo valor es otro
documento o un arreglo de documentos.
• Muchos a muchos:
– Dos o más documentos contienen al menos un campo cuyo
valor es otro documento o un arreglo de documentos.
Formas en que MongoDB permite relacionar
documentos: Embebimiento
• Ocurre cuando se toman datos relacionados para ser insertados en un documento.
• Para esto, se le asigna directamente al campo de un documento un “sub-
documento”.
• Los arreglos se consideran sub-documentos para estos propósitos.
• Puede haber dos o mas subdocumentos (que no sean arreglos) sin necesidad que
estén incluidos en un arreglo.
• La ventaja radica en consultas sencillas (incluyendo operaciones para actualizar o
eliminar documentos) y en el mejoramiento total de su desempeño.
• La desventaja de embeber documentos es que se generan documentos grandes y/o
no acotados, produciendo una carga excesiva de memoria al leer/buscar
documentos y un alto impacto al insertar documentos..
• Un simple documento en BSON no puede exceder los 16 MB de espacio en disco.
Formas en que MongoDB permite relacionar
documentos: Referencia
• Cuando desde un documento dentro de una colección hace referencia a otro
documento existente en otra colección.
• La referencia se hace asignándole al campo que hace la referencia un
arreglo conteniendo solo uno o más valores de tipo ObjectID (sin sus claves)
o bien, usando un campo cuyo nombre indique que es un identificador
adicional definido por el programador en otro documento de otra colección.
• Ventajas:
– Evita duplicación de datos
– Se logran documentos más pequeños
• Desventajas
– Costo extra de recursos ya que se requiere hacer un join entre 2 o más documentos,
provocando un impacto en el desempeño de la lectura.
Patrones de diseño de esquemas en MongoDB
• Un patrón de diseño de esquema es una guía para ayudar a los desarrolladores a
planificar, organizar y modelar datos.
• Generar un esquema sin un patrón de diseño se conoce como “Anti-patrón de esquema”
y resulta en desempeño por debajo del óptimo y soluciones no escalables.
• Los antipatrones más comunes son:
– Arreglos masivos
– Cantidad muy grande de colecciones
– Documentos “hinchados”
– Índices innecesarios
– Consultas sin índices
– Datos que se acceden juntos pero que están almacenados en diferentes colecciones.
• No es fácil detectar un anti-patrón, por lo que se recurre a herramientas como
MongoDB Atlas Tools. La única desventaja es que a dichas herramientas solo se tiene
acceso desde cuentas que no son gratuitas.
Tipos de datos en MongoDB
• Double: Número real de 64 bits.
• String: Cadena de caracteres
• Object: objeto. Cualquier dato que no concuerde con los demás tipos
• Array: Arreglo de cualquier tipo con cero o más elementos dentro de un par de corchetes.
• Datos binarios (“binData”): Véase “Datos Binarios en MongoDB”
• ObjectId: Tipo de dato por defecto de las claves primarias de las colecciones. Contiene un número
hexadecimal de exactamente 24 dígitos.
• Boolean: verdadero o falso
• Date: Véase “Fechas en MongoDB”
• Null: Valor nulo o vacío. Objetos vacíos ({}), arreglos vacíos ([ ]) y strings vacíos (“”) no se consideran null.
• Expresión regular: Un string con una expresión regular válida encerrada entre slashes en vez de comillas.
• Javascript: Función JavaScript definida por el programador
• Int: Entero de 32 bits
• Long: Entero de 64 bits
• Timestamp: Véase “Timestamp en MongoDB”
• Decimal: Número real de 128 bits.
• Min Key y Max Key: Tipos manejados internamente por MongoDB
Datos binarios en MongoDB
• Un dato de tipo binario sirve para asignársele el contenido, codificado como
un String de base 64, de cualquier expresión que no pueda ser interpretada
como texto.
• Para crear un dato de tipo binario, se debe utilizar la clase BinData, cuyo
único constructor contiene 2 parámetros:
– subtype: Un número entero que indica el subtipo de dato binario. Puede tener uno
de los siguientes valores:
• 0: Dato binario genérico
• 1: Función
• 2: Arreglo de bytes
• 3: UUID (Universal Unique Identifier) antiguo
• 4: MD5: Cualquier string codificado con el algoritmo de encriptación MD5
• 128: Dato binario definido por el usuario
– buffer: Un String codificado en base 64 con el contenido a guardar.
Datos binarios en MongoDB
• Al guardar el dato binario en la base de datos, su representación
en el resultado de cualquier consulta es una llamada al método
estático from de la clase Buffer, con dos parámetros: el valor del
buffer expresado en hexadecimal y la palabra “hex”.
• Ejemplo: Considere una colección llamada testbin definida de la
siguiente manera:
• Si usted ejecuta la siguiente instrucción:
• Se obtendrá esto:
Datos binarios en MongoDB
• Se puede obtener el largo del buffer encapsulado en el
objeto binData llamando al método length.
Fechas en MongoDB
• Un dato de tipo de fecha sirve para encapsular una fecha
• Para crear un objeto apuntando a una fecha, se debe
utilizar el constructor sin argumentos de la clase Date o
de ISODate
• Un objeto Date o ISODate permite se representado como
un String con toString() u obtener un campo de la fecha
apuntada con getDay, getMonth, etc.
Timestamp en MongoDB
• Un dato de tipo timestamp sirve para encapsular una fecha
y hora (a diferencia de Date que solo encapsula la fecha)
• Para crear un objeto timestamp, se debe utilizar uno de los
dos constructores de la clase Timestamp:
– Timestamp(utime, ordinal): Crea un objeto a partir de la fecha
especificada en formato UNIX (cantidad de segundos desde la
medianoche del 1 de enero de 1970) en utime y el ordinal de
incremento especificado en ordinal.
– Timestamp(): Crea un objeto a partir de la fecha actual con
ordinal 1.
Sentencias MongoDB
• Al igual que la mayoría de las bases de datos NoSQL, MongoDB no utiliza
(normalmente) SQL para generar sentencias. En vez de eso, trata la base de
datos y cada una de sus colecciones como un objeto conteniendo métodos a
los cuales poder llamar e incluir parámetros de entrada.
• Se asume que el objeto representando a la base de datos se llama db.
• Se asume que todas las colecciones son atributos de db.
• Se asume que todas las colecciones tienen los mismos métodos entre sí.
• En consecuencia, para llamar a un método de una colección, se debe usar la
expresión db.<nombre_coleccion>.<metodo>({<args>})
• Todos los métodos requieren como parámetro un objeto JSON.
• En este documento, se mostrará, si es posible la equivalencia entre una
sentencia MongoDB y su correspondiente sentencia SQL
Sentencias MongoDB
• MongoDB se basa en los lenguajes TypeScript y JavaScript para las
sentencias. Para ello, en MongoDB se asume lo siguiente:
– La base de datos “actual” es un objeto de nombre db
– Desde la base de datos “actual” se puede acceder a las colecciones de otras
bases de datos en el mismo servidor.
– Tanto la base de datos “actual” como todas las bases de datos hacia las cuales
se puede acceder desde ella tienen los mismos métodos.
– Todas las colecciones son objetos.
– Todas las colecciones son atributos dentro de db.
– Todas las colecciones poseen los mismos métodos sin importar el contenido de
cada una.
– El argumento para todos los métodos, tanto de las bases de datos como de las
colecciones es SIEMPRE un objeto BSON o JSON.
Sentencias de colecciones: aggregate
• Formato: db.<coleccion>.aggregate(<etapas>, <opciones>)
• El método aggregate es utilizado para buscar documentos de manera más elaborada,
agregando restricciones como agrupación, ordenamiento o filtraje, lo que equivale en
SQL a una sentencia SELECT con WHERE, GROUP BY y/o ORDER BY o un SELECT
del resultado de una función sobre una columna.
• El valor devuelto por este método se considera un objeto cursor por lo que desde ese
objeto se puede llamar a los mismos métodos que tienen todos los cursores.
• El argumento <etapas> debe ser un arreglo de objetos, donde en contenido de cada
objeto consiste en una única clave igual a una palabra reservada reconocida por
MongoDB y que debe empezar con el caracter peso (“$”) que corresponde a una etapa
– Cada palabra reservada utilizada como clave puede equivaler a una función de SQL.
– La primera etapa se aplica directamente sobre la colección.
– La segunda etapa y posteriores se aplica a los resultados de etapa(s) anteriores(es)
– Dos o más etapas pueden tener la misma clave, aunque su valor sea distinto.
Sentencias de colecciones: aggregate
• El parámetro <opciones> debe ser un objeto BSON
conteniendo algunos de los siguientes campos:
– allowDiskUse: Opcional de tipo booleano para indicar si se permite
escritura en archivos temporales mientras se procesan las etapas. Si
se omite, se asume false.
– cursor: Opcional. Su valor debe ser un objeto conteniendo un único
campo con clave batchSize y valor numérico entero positivo indicando
el tamaño inicial del batch para cualquier cursor obtenido de una etapa
– maxTimeMS: Opcional. Un número positivo indicando el tiempo
máximo en milisegundos que debe demorarse el método aggregate en
ejecutar todas las etapas especificadas.
Sentencias de colecciones: aggregate
• El parámetro <opciones> debe ser un objeto BSON
conteniendo algunos de los siguientes campos (cont.):
– bypassDocumentValidation: Campo booleano opcional. Se aplica
solo para una o más ocurrencias de las etapas $out y/o $merge. Si
su valor es true, se evita la validación de documentos durante
cualquiera de esas etapas.
– collation: Opcional. Véase Collation.
– let: Opcional. Debe ser un objeto conteniendo campos con clave y
valor arbitrarios para acceder al valor asociado a cada clave dentro
de cualquier etapa colocando la clave deseada en el valor de
cualquier campo, anteponiéndole el $$.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $count: Sirve para obtener la cantidad total de
documentos en la colección o la etapa anterior.
 El valor recibido para esta etapa debe ser un String
indicando la clave de un campo cualquiera.
 El resultado es un objeto BSON con un único campo
con la clave especificada y el valor igual a la cantidad
obtenida.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $group: Sirve para agrupar resultados con respecto a un campo
específico, lo que equivale a GROUP BY en SQL. El valor para esta
clave debe ser un objeto JSON conteniendo las siguientes dos
claves:
– _id: Sirve para indicar el(los) campo(s) de agrupación, su valor puede ser
uno de los siguientes:
• La palabra null para indicar que no se agruparán los resultados
• Un string con el nombre de un campo de la colección, anteponiéndole el $ para
indicar que los resultados serán agrupados con respeco a ese campo
• Un objeto JSON para indicar que los resultados serán agrupados por dos o más
campos. El objeto debe contener, por cada campo, un atributo con clave igual al
nombre del campo en la colección y valor igual al mismo nombre anteponiéndole el $.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $group (cont.):
– ???? : La segunda clave puede tener cualquier nombre, pero
su valor debe ser un objeto JSON conteniendo una única clave
igual a un operador apropiado como $sum (cuyo valor puede
ser un número 1 para indicar que se contarán los resultados o
el nombre de un campo, anteponiéndole el $ para indicar que
sumarán los valores para ese campo entre todos los
resultados) o $mergeObjects (cuyo valor puede ser un
documento o un string igual a un campo cuyo valor sea uno o
varios documentos embebidos anteponiéndole el $).
Sentencias MongoDB: etapas reconocidas por
aggregate
• $sort: Sirve para ordenar resultados con respecto a un
campo específico, lo que equivale a ORDER BY en SQL.
– El valor para esta clave debe ser un objeto JSON conteniendo
al menos una clave igual al nombre de un campo utilizado para
el ordenamiento y un valor para esa(s) clave(s) igual a 1 para
orden ascendente o -1 para orden descendente.
– Si existe una etapa $group, esta debe incluirse antes que la
etapa $sort. De lo contrario, ocurriría un error de falta de
memoria.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $match: Sirve para filtrar resultados. Su equivalencia con
SQL depende de las siguientes 2 situaciones. Para ambas,
el valor de esta clave es un objeto JSON:
– Si ese objeto obtiene uno o varios atributos, cada uno con clave
igual a un campo distinto de la colección y con un valor
cualquiera, se obtendrán todos los resultados tales que el valor
del campo definido en la primera clave sea igual al valor de esa
clave y el valor del campo definido en la segunda clave sea igual
al valor de esa clave y así sucesivamente. Usar $match de esta
manera equivale a un WHERE campo1=valor1, campo2=valor2,...
Sentencias MongoDB: etapas reconocidas por
aggregate
• $match (cont.):
– Si esa etapa aparece después de una etapa $group y la clave
dentro del objeto que es valor de la etapa $match es igual a la
clave dentro del objeto que es valor de la etapa $group que no
sea _id, se obtendrán todos los resultados agrupados cuya
suma sea igual al el valor asociado a la clave en la etapa
$match. Esto equivale en SQL a algo como SELECT grp,
SUM(col) AS total FROM tabla GROUP BY grp HAVING
total=valor .
Sentencias MongoDB: etapas reconocidas por
aggregate
• $unwind:
– Sirve para tomar un arreglo de objetos dentro de un documento y generar, por cada elemento
dentro del arreglo, un nuevo documento temporal. En consecuencia, el valor para esta clave
debe ser el nombre del campo en el documento cuyo valor es un arreglo, encerrado entre
comillas y anteponiéndole un $
– Para poder utilizar los documentos generados por $unwind, esta etapa debe ser la primera
dentro del argumento de aggregate, a menos que el documento que resulte de una etapa
anterior contenga una clave cuyo valor sea un arreglo.
– Por cada documento de entradaen la colección o la etapa anterior, se genera documento de
salida con un campo igual al campo cuyo valor es el arreglo y valor igual a cada elemento en
el arreglo y con todos los demás campos del documento de entrada inalterados, preservando
el orden en el que todos los campos fueron definidos.
– Por ejemplo, para el documento {"_id": 1",num": 1, "arr": [2, 3, 4]}, con $unwind, se obtienen los
documentos {"_id": 1",num": 1, "arr": 2}, {"_id": 1",num": 1, "arr": 3}, {"_id": 1",num": 1, "arr": 4}
– En consecuencia, la salida de $unwind puede generar documentos con _id repetida.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $addFields:
– Agrega uno o varios campos al documento resultante de la llamada a aggregate.
– Los campos que se agregan pueden tener un valor constante o uno que resulte de
operaciones con un campo de los documentos de la colección o del resultado de una etapa
anterior.
• Si el valor es una constante, el nuevo campo tendrá ese valor para todos los documentos
– $addFields también sirve para agregar campos nuevo a un documento embebido en otro
especificando el nombre del campo cuyo valor es uno o varios documentos embebidos y el
nombre del campo dentro de los documentos embebidos, separados por un punto.
• Si no todos los documentos en una colección contienen la clave con los documentos embebidos, no se
realizará ninguna acción en ellos.
– El resultado son todos los documentos de la colección o de la etapa anterior con los nuevos
campos incorporados al final de los ya existentes al llegar a la etapa actual.
– Si uno de los campos en el argumento de aggregate ya existe en la colección o la etapa
anterior, su valor en la salida será reemplazado por su valor en el argumento.
– A partir de la versión 4.2 de MongoDB, se definió un alias para esta etapa llamado $set
Sentencias MongoDB: etapas reconocidas por
aggregate
• $fill:
– Rellena todos los campos faltantes especificados de todos los
documentos de una colección o etapa anterior por valores
específicos.
– Para ello, recorre toda la colección o la etapa anterior
buscando cada campo especificado y, si ese campo no se
encuentra en un documento, lo agrega con el valor específico.
– La salida son todos los documentos de la colección o de la
etapa anterior con los campos rellenados en donde están
originalmente ausentes.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $fill:
– Esta etapa admite como entrada un objeto BSON con los siguientes campos
– partitionBy: Opcional. Sirve para agrupar todos los resultados en una partición definida por una o más expresiones. Su
valor debe ser un objeto BSON con uno o varios campos.
– La clave para cada campo debe ser arbitraria.
– El valor para cada campo debe ser una expresión basada en uno o varios campos de la colección o etapa anterior.
– partitionByFields: Opcional. Si la partición es por uno o más campos en vez de expresiones en funcion de uno o varios
campos, se puede reemplazar partitionBy por partitionByFields. Su valor debe ser un arreglo de Strings con los nombres
de campos existentes en la colección o etapa anterior.
– output: Obligatorio. Su valor es igual a un objeto conteniendo uno o varios campos, cada uno con clave igual a un campo
deseado a rellenar y valor igual a un objeto JSON con un único campo cuya clave depende del modo de rellenado
deseado:
• value: Rellenar asignando un valor específico
• method: Rellenar utilizando un método especial. Actualmente MongoDB admite 2 valores posibles para este campo:
– linear:Método de interpolación lineal ([Link] en base a los valores presentes para el campo deseado en
los documentos adyacentes a aquellos en los que el campo no está presente
– locf: Método L.O.C.F. (Last Observation Carried Forward). Consiste en rellenar un campo ausente con el último valor observado para el mismo campo en
documentos anteriores.
– sortBy: Obligatorio si dentro del valor de output aparece la clave method. Su valor es cualquier valor admitido por la etapa
$sort en aggregate, excepto el campo que se desea rellenar, incluso si los documentos ya están ordenados por el campo
seleccionado para ordenar.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $limit:
– Limita los resultados de búsqueda a una cantidad específica de
documentos.
– El valor para esta etapa debe ser un número entero positivo
indicando la cantidad máxima de documentos a obtener.
– Su uso equivale al uso de la palabra reservada LIMIT en
MySQL, TOP en SQL Server, FETCH FIRST n ROWS ONLY
en versiones recientes de Oracle y a WHERE ROWNUM<n en
versiones antiguas de Oracle.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $merge:
– Inserta todos los resultados de una colección o de la etapa anterior en
otra colección.
– Su comportamiento hace que la llamada a aggregate sea equivalente a
un MERGE en SQL, con la diferencia de que, en MongoDB, si la
colección no existe, se crea automáticamente antes de insertar los
documentos en ella.
– Si los documentos a insertar no tienen un campo _id, se agregarán
automáticamente
– Si esta etapa está presente, debe ser la ÚLTIMA dentro del argumento de
aggregate.
– A partir de la versión 4.4 de MongoDB la colección desde donde se leen
los documentos y la colección donde se insertan pueden ser la misma.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $merge (cont.):
– El valor de esta etapa debe ser un objeto JSON conteniendo las siguientes claves
con sus respectivos valores correctos:
• into: Clave obligatoria para indicar en qué colección guardar los resultados. Admite uno de los
siguientes valores posibles:
– Un String indicando el nombre de una colección en la misma base de datos que la colección desde donde
se llamó a aggregate.
– Un objeto JSON conteniendo las siguientes dos claves obligatorias para indicar que los resultados se
guardarán en una colección de otra base de datos:
» db: nombre de la base de datos
» coll: nombre de la colección
• on: Clave opcional para indicar el o los campos utilizados como identificador único (equivalente
a definir un INDEX del tipo UNIQUE en MySQL). Su valor puede ser un String indicando un
único campo o un arreglo de Strings indicando múltiples campos. Si se omite, se asume el
campo _id.
– Cualquier campo distinto de _id que sea valor de este campo debe haber sido definido como índice único
(véase la función createIndex)
Sentencias MongoDB: etapas reconocidas por
aggregate
• $merge (cont.):
– El valor de esta etapa debe ser un objeto JSON conteniendo las siguientes claves con sus
respectivos valores correctos (cont):
• whenMatched: Clave opcional para indicar la acción a realizar si los valores de el(los) campo(s)
especificado(s) en el campo on de los documentos a insertar son iguales a los valores de ese(esos)
mismo(s) campos entre todos los documentos ya existentes en esa colección. El valor para este campo
puede ser uno de los siguientes. Si se omite, se asume el valor merge:
– replace: Reemplaza el documento existente con el nuevo documento (elimina todos los demás campos de la colección
objetivo y los reemplaza con los nuevos campos).
– keepExisting: Mantiene el documento existente en la coleción objetivo.
– merge: Igual que replace, pero merge solo reemplaza los valores de los campos existentes en el documento objetivo e
inserta el resto.
– fail: Detiene la operación. Esto no evita que documentos anteriores al primero que concuerde con el de la colección sean
insertados.
• whenNotMatched: Clave opcional para indicar la acción a realizar si los valores de el(los) campo(s)
especificado(s) en el campo on de los documentos a insertar no son iguales a los ya existentes en la
colección objetivo. El valor para este campo puede ser uno de los siguientes. Si se omite se asume el
valor insert:
– insert: Inserta el documento
– discard: No inserta el documento
– fail: Detiene la operación. Esto no evita que documentos anteriores al primero que concuerde con el de la colección sean
insertados.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $merge con etapas anidadas:
– Para la clave whenMatched, en vez de un String con uno de sus valores posibles, se le
puede asignar un arreglo de etapas anidadas como si se llamara recursivamente a
aggregate desde la colección objetivo.
– Solo las etapas $addFields/$set, $project, $unset, $replaceRoot y $replaceWith pueden
incluirse en el arreglo.
– Para estos casos, si los documentos a insertar y los de la colección objetivo coinciden en
al menos un campo
• Usted puede hacer referencia al campo en la colección con el nombre de ese campo anteponiéndole
el $
• Para hacer referencia al campo en los documentos a insertar, se debe usar la expresión
$$new.<nombre_coleccion>.
– También en estos casos, se puede agregar al valor de $merge el campo let con valor
igual a un objeto JSON con uno o varios campos de claves y valores arbitrarios (las
claves no deben existir en la colección o etapa anterior). Para referenciar a cualquiera de
estas variables en las etapas anidadas, se debe usar $$ y el nombre de la variable.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $project:
– Permite obtener solo campos específicos de la colección o etapa anterior
para ser utilizados en etapas posteriores. El valor para esta etapa debe
ser un objeto JSON conteniendo un campo con el mismo nombre que el
campo a incluir o descartar y valor igual a uno de los siguientes:
• Cualquier número distinto de cero: Si se incluye tal como está
• <expr>: Si se incluye con valor igual al resultado de <expr>
• 0: Si no se incluye.
– El campo _id se asume incluido a menos que explícitamente usted
indique que se debe descartar.
– Cualquier campo distinto de _id que no es colocado en el objeto se
asume descartado.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $unset:
– Permite descartar campos de una colección o etapa anterior
para usar el resto de los campos en etapas posteriores.
– Su valor debe ser un String para descartar un único campo o
un arreglo de Strings para descartar varios
– Puede descartar campos de documentos embebidos indicando
el nombre del campo en la colección, el caracter punto y el
nombre del campo en el documento embebido
– Equivale a la etapa $project asignando valor 0 al o a los
campos a descartar.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $out:
– Permite crear otra colección en una base de datos cualquiera e insertar
allí los documentos en la colección desde donde se llamó a aggregate o
en una etapa anterior.
– Se puede omitir la base de datos para indicar que se utilizará la base de
datos actual.
– Similar a $merge especificando en into un objeto con el nombre de la
base de datos y de la colección en esa base de datos, pero $out tiene
varias diferencias especificadas en la diapositiva siguiente
– El formato del valor de $out es:
[Link]([{$out:{db: “dbname”, coll: “collname”} }])
[Link]([{$out:“collname” }])
Sentencias MongoDB: etapas reconocidas por
aggregate
• $out: diferencias con $merge:
– Si la colección existe en la base de datos especificada, todos sus
documentos son reemplazados.
– Puede hacer referencia a una base de datos distinta de la actual solo a partir
de la versión 4.2 de MongoDB. $merge puede hacerlo en todas las versiones
– Un $out equivale a un INSERT INTO C2 SELECT * FROM C1 en
SQL, mientras que un $merge equivale a: MERGE C2 AS TARGET
USING (SELECT * FROM C1) AS SOURCE ON MATCH ([Link] =
[Link]) WHEN MATCHED THEN UPDATE SET
[Link] = [Link] WHEN NOT MATCHED THEN
INSERT (FIELDX) VALUES ([Link])
Sentencias MongoDB: etapas reconocidas por
aggregate
• $replaceRoot:
– Reemplaza todos documentos en la colección por nuevos documentos, sin
importar los campos que componen estos.
– Puede reemplazar los documentos de una colección por documentos embebidos
dentro de la misma asociados a una clave, siempre y cuando esa clave
aparezca en todos los documentos de la colección y sea igual a uno o varios
documentos embebidos. De lo contrario, ocurrirá un error
– El valor para esta etapa es un objeto JSON conteniendo una única clave
llamada newRoot cuyo valor puede ser:
• Un documento con uno o varios campos de cualquier tipo
• Un string con el nombre de un campo en la colección cuyo valor sea un documento
embebido o un arreglo de documentos embebidos, anteponiéndole el $.
• Una expresión que devuelve un documento como el operador $mergeObjects (que se
verá más adelante)
Sentencias MongoDB: etapas reconocidas por
aggregate
• $replaceWith:
–Igual a $replaceRoot, con la diferencia de que el
valor para $replaceWith es un documento en vez
de un objeto con la clave newRoot
Sentencias MongoDB: etapas reconocidas por
aggregate
• $skip:
– Lo opuesto de $limit. Permite obtener todos menos los
primeros N documentos de la colección o la etapa
anterior.
– Admite los mismos valores posibles que $limit.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $sortByCount:
– Busca el campo especificado entre todos los documentos de la colección o
etapa anterior y, por cada valor encontrado del campo, contar todas las
ocurrencias de ese valor.
– El valor para este campo debe ser string con el nombre de un campo
existente entre al menos un documento, anteponiéndole el $
– La salida es una colección conteniendo un documento por cada valor distinto
del campo especificado en la colección o etapa anterior.
– Cada documento tiene los siguientes campos:
• _id: El valor de este campo es igual a un valor encontrado en el campo especificado
• count: la cantidad de ocurrencias de ese valor entre todos los documentos
– A esta etapa se le llama $sortByCount porque los documentos de la salida
son ordenados descendentemente por el valor de count.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $unionWith:
– Genera una unión entre la colección o una etapa anterior y otra colección.
– Equivalente al uso de UNION o UNION ALL en SQL.
– El valor de este campo debe ser un objeto JSON que contenga un campo con cada
una de las siguientes claves:
• coll: Campo obligatorio. Debe ser un string con el nombre de la colección con la que se unirá la
colección desde donde se llamó a aggregate o una etapa anterior.
• pipeline: Campo opcional. Debe ser un arreglo de etapas a aplicar (en orden) a la colección especificada
en coll. Se puede incluir cualquier etapa admitida por aggregate. Si se incluye este campo, la unión se
hará con el resultado de todas las etapas sobre la colección en lugar de hacerlo directamente con esa
colección.
– La salida es una colección con todos los documentos de la colección desde donde
se llamó a aggregate o de la etapa anterior y todos los documentos de la colección
especificada en coll o, si se incluye el campo pipeline, el resultado de la última etapa
en en arreglo asignado a ese campo.
– La salida puede tener _id repetidas.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $lookup:
– Genera un LEFT OUTER JOIN entre dos colecciones distintas por medio de un
campo específico de cada uno.
– El uso más básico de esta etapa, que corresponde a un LEFT OUTER JOIN sin
restricciones, admite un objeto BSON con los siguientes campos obligatorios:
• from: Un String con el nombre de la colección con la cuál hacer el JOIN
• localField: Un String con el nombre del campo en la colección desde donde se llamó al método
aggregate para hacer el JOIN
• foreignField: Un String con el nombre del campo en la colección especificada en from.
• as: Un String con el nombre del campo al que se le asignará todos los documentos en from.
– El resultado en este caso y todos los siguientes es una colección en el que cada
documento contiene todos los documentos del campo que llama a aggregate más
un campo nuevo con el nombre especificado en as igual a un arreglo con todos los
documentos embebidos desde from cuyo valor del campo especificado en
foreignField sea igual al valor del campo especificado en localField.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $lookup (cont):
– Esta etapa también permite aplicar restricciones al LEFT OUTER JOIN sin necesidad de
especificar los campos de cada colección involucrados en el JOIN
– Para ello, el objeto BSON a recibir debe tener los campos from y as y los siguientes dos
campos adicionales:
• let: Opcional. Un objeto BSON con uno o varios campos. Cada campo tiene una clave arbitraria y un
valor igual a un String con el nombre de un campo de la colección desde donde se llama a
aggregate, anteponiéndole el $.
• pipeline: Un arreglo conteniendo cero o más etapas que no sean $out ni $merge. La presencia de
este campo equivale a llamar a aggregate desde la colección especificada en from. Desde
cualquiera de las etapas en pipeline se puede acceder al valor de cualquiera de las claves
especificadas en let anteponiéndole el $$.
– Esto permite, entre otras cosas, hacer múltiples LEFT OUTER JOINS con otras
colecciones.
– La única limitación con este uso de $lookup es que obliga a que en pipeline haya una
etapa match para igualar un campo de la colección que llama a aggregate con uno de la
colección especificada en from.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $lookup (cont):
– La solución a la limitación descrita en la diapositiva
anterior es simplemente incluir los campos localField y
foreignField. Con esto, ya no es necesario incluir la
etapa $match en el pipeline a menos que se desee
comparar otros campos que no sean los especificados
en localField y foreignField o se desee hacer algún
filtraje con estos dos o cualquier otro campo.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $facet:
– Esta etapa permite asignar a cada uno de N campos de salida con clave
arbitraria el resultado de llamar a aggregate usando una o varias sub-etapas.
– El resultado es un único documento con los campos especificados.
– Para cada campo de salida:
– la etapa cero siempre será el contenido de los documentos de la colección o
de la etapa anterior.
– El valor a asignar a ese campo es un arreglo de sub-etapas definidas del
mismo modo que las etapas reconocidas por aggregate.
– No se permiten las etapas $out, $merge y $facet y algunas otras que no son
vistas en este documento, para ser utilizadas como sub-etapas en cualquier
campo de salida.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $bucket:
– Esta etapa permite agrupar valores para propósitos estadísticos.
– El valor recibido por esta etapa debe ser un objeto BSON con los siguientes campos:
– groupBy: El nombre del campo en la colección o etapa anterior que se desee usar para
agrupar, anteponiéndole el caracter peso ($)
– boundaries: Un arreglo con dos o más valores posibles que tenga el campo.
– Todos los valores deben ser del mismo tipo de dato a menos que todos ellos sean de
tipos de datos numéricos.
– default: El nombre del campo de salida que tendrá todos los documentos cuyo valor del
campo especificado en groupBy sea menor que el menor elemento de boundaries o
mayor que el mayor elemento de ese arreglo. Si este campo no es especificado habiendo
valores con estas características, se obtendrá un error.
– output: Un objeto BSON conteniendo uno o varios campos arbitrarios, cada uno con un
valor estático o una expresión en función de cualquier campo de la colección o etapa
anterior, anteponiendo a cada campo el caracter peso.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $bucket (cont.):
– La salida de esta etapa son N documentos de salida, con M-1<N<M y M igual a la cantidad
de elementos en boundaries.
– Dada documento i-ésimo de salida contendrá los siguientes campos:
– _id: Campo agregado automáticamente con valor igual al elemento i-ésimo en boundaries
– Todos los campos definidos en el objeto pasado como valor al campo output, calculados
en función de los campos de los valores de los documentos cuyo valor del campo
especificado en groupBy sea mayor o igual que el elemento i-esimo en boundaries y
menor que el elemento (i+1)-esimo en el mismo arreglo.
– Además, si existen valores del campo groupBy menores al primer elemento de boundaries o
que sean mayores o iguales al último, se generará un documento de salida adicional del
mismo modo indicado arriba con el valor de _id igual al valor del campo default.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $bucketAuto:
– Esta etapa es similar a $bucket con las siguientes diferencias en el objeto BSON recibido por
$bucketAuto:
– El campo boundaries es reemplazado por el campo buckets, cuyo valor es la cantidad
deseada de buckets en la salida.
– Se remueve el campo default, ya que no es necesario.
– Se agrega el campo granularity, cuyo valor es un string para especificar la serie numérica
preferida para asegurar que los límites calculados entre un bucket y otro terminen en
números redondeados preferentemente o en sus potencias de 10.
– Este campo es opcional. Si se omite, se divide el máximo valor de entre todos los del
campo groupBy por la cantidad de buckets (llamemos c al cuociente) y el valor de _id
para cada documento i-ésimo será un objeto conteniendo un mínimo igual a c*i y un
máximo igual a c*(i+1).
– El campo output es opcional
Sentencias MongoDB: etapas reconocidas por
aggregate
• $bucketAuto (cont.):
– Los valores posibles del campo granularity son:
– “R<n>”, con n igual a 5, 10, 20, 40 u 80: Números de Renard (ISO 5:1952). Cada valor
mínimo en el objeto _id en la salida tendrá valor igual a 10 elevado al cuociente entre el
número i-ésimo del elemento y n (por ejemplo, para 10 buckets y n=80, el primer
documento tendrá _id con min igual a 10 elevado a 0/80, el segundo tendrá min igual a
1/80, etc.
– “E<n>”, con n igual a 6, 12, 24, 48, 96 o 192. Serie E (IEC 63:1952, IEC 60063:2015). El
valor de _id es calculado del mismo modo que los números de Renard, pero el resultado
es redondeado al entero más cercano.
– “1-2-5”. Serie 1-2-5. Los primeros 3 valores mínimos en el objeto _id serán un 0.1, un 0.2
y un 0.5, los siguientes 3 serán 1, 2 y 5, los siguientes 3 serán 10, 20, 50, etc. Hasta
completar la cantidad de buckets.
– “POWERSOF2”: el valor mínimo en el objeto _id será una potencia de 2. Para el primer
documento será 1 (“2 elevado a cero”), 2 para el segundo, 4 para el tercero, etc.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $bucketAuto (cont.):
– La salida de esta etapa serán N documentos, con N igual al valor de buckets.
– Cada documento i-ésimo contendrá los siguientes campos:
– _id: Un objeto conteniendo 2 campos
– min: Un número con el valor calculado para la cantidad de buckets y
granularidad especificadas y el número del bucket actual.
– max: El valor de min para el bucket (i+1)-ésimo
– Todos los campos especificados en el objeto output en función de los
documentos con los valores del campo especificado en groupBy mayores
o iguales que el valor de min en _id y menores que el valor de max en ese
mismo objeto. Si se omite el campo output, se mostrará un único campo
llamado count con la cantidad de documentos en el mismo intervalo.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $sample
• Esta etapa recibe como entrada un objeto BSON con un único
campo llamado size, que debe tener un valor entero positivo.
• La salida es size documentos escogidos al azar.
• Si $sample es la primera etapa, size es el 5% de la cantidad
total de documentos en la colección y la colección tiene más
de 100 documentos, se utiliza un cursor pseudoaleatorio.
• En caso contrario, lee todos los documentos de la colección o
etapa anterior y realiza un ordenamiento aleatorio para
después seleccionar los primeros size documentos.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• Esta etapa permite devolver los mismos documentos de la colección o etapa anterior más uno o
varios documentos nuevos con datos faltantes de un campo específico para propósitos
estadísticos.
• La etapa admite un objeto BSON de entrada con los siguientes campos:
• field: Obligatorio. El nombre del campo a densificar. No debe empezar con el caracter peso ($).
• Si la colección o etapa anterior contiene el campo a densificar con un nombre que empiece
en $, usted puede incluir una etapa $project antes de $densify para “quitar el $” del campo.
• No se garantiza que los documentos de salida estén ordenados por el campo especificado
a menos que el valor de field sea el operador $sort pasando un objeto con el nombre de
ese campo y valor 1 o -1.
• partitionByFields: Opcional. Un arreglo de strings con los nombres de los campos utilizados
como clave compuesta para agrupar los documentos.
• Cada grupo resultante se conoce como partición
• Si se omite este campo, se asume una única partición para todos los documentos de la
colección o etapa anterior
• Ningún elemento debe empezar con $.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• La etapa admite un objeto BSON de entrada con los siguientes campos (cont.):
• range: Obligatorio. Un objeto BSON para determinar cómo serán densificados los datos. Debe tener los
siguientes campos:
• bounds: Obligatorio. Su funcionalidad depende de qué valor se le asigna a este campo de entre los
siguientes:
• Arreglo: Permite agregar documentos nuevos cuyo valor del campo field esté entre el primer
(inclusive) y el segundo (exclusive) elemento y no exista entre los documentos de la colección o
etapa anterior. El arreglo recibido debe ser de largo 2 y debe contener valores distintos con ell
mismo tipo que el campo field y el primer elemento debe ser menor que el segundo.
• NOTA: No se agregarán documentos nuevos con valores fuera del campo especificado, pero
documentos existentes de la colección o etapa anterior con valores del campo fuera del
rango NO serán descartados.
• String: Debe ser uno de los siguientes valores:
• full: Agrega documentos nuevos cuyo valor esté entre el mínimo y el máximo de entre todos
los valores del campo field en la colección o etapa anterior.
• partition: Similar a full pero para cada partición. Aplicable solo si se especificó el campo
partitionByFields.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• La etapa admite un objeto BSON de entrada con los siguientes campos (cont.):
• range: Obligatorio. Un objeto BSON para determinar cómo serán densificados los datos.
Debe tener los siguientes campos (cont).:
• step: Obligatorio. La cantidad a incrementar entre valor y valor del campo field para
generar los documentos nuevos con cada valor resultante que no esté entre los
documentos de la colección o etapa anterior. El campo puede ser de cualquier tipo
numérico si no se especificó el campo siguiente. En caso contrario. debe ser un
número entero.
• unit: Obligatorio si el campo especificado en field es de tipo fecha. Prohibido incluirlo
si el campo es de tipo numérico. Debe especificar la unidad de tiempo en que se
aplicará el incremento especificado en el campo step. Puede ser un string con uno de
los siguientes valores: “milisecond” (milisegundos), “second” (segundos), “minute”
(minutos), “hour” (horas), “day” (días), “week” (semanas), “month” (meses), “quarter”
(cuatrimestres), “year” (años).
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• La salida es uno o varios documentos de manera tal que:
• Para el campo especificado en field, se genera una progresión aritmética con
las siguientes características:
• El primer término de la progresión es el valor mínimo especificado en el
campo [Link] (el primer elemento del arreglo si es un arreglo, el
valor menor de entre todos los documentos de la colección o etapa
anterior si es “full” o el valor menor para cada partición si es “partition”).
• El término n-esimo, con n>2 es la suma entre “el primer término” y “step
multiplicado por n”
• Si el campo field es de tipo fecha, se aplica la unidad especificada en
[Link] para el cálculo de los términos
• Todos los documentos cuyo valor del campo field está fuera del rango
especificado en range son incluidos con todos sus campos.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• La salida es uno o varios documentos de manera tal que (cont.):
• Si no se especificó el campo partitionByFields:
• Si un valor del campo field dentro del rango especificado en
range existe en un documento de la colección o etapa
anterior, se incluye ese documento con todos sus campos,
incluso si el valor no es un término de la progresión
aritmética mencionada anteriormente.
• En caso contrario, se crea un nuevo documento conteniendo
únicamente el campo especificado en fields con ese valor.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• La salida es uno o varios documentos de manera tal que (cont.):
• Si se especificó el campo partitionByFields y el valor de [Link] es “full”
o es un arreglo:
• Si existe un documento en la colección o etapa anterior con el valor del
campo fields dentro del rango especificado en range y con una
combinación posible de valores, de entre todos los documentos de la
colección o etapa anterior, para cada campo especificado en
partitionByFields, se incluye ese documento con todos sus campos,
incluso si el valor no es un término de la progresión aritmética
mencionada anteriormente.
• En caso contrario, se crea un nuevo documento conteniendo el campo
especificado en fields y cada campo en partitionByFields con la
combinación de valores no encontrada para todos ellos.
Sentencias MongoDB: etapas reconocidas por
aggregate
• $densify
• La salida es uno o varios documentos de manera tal que (cont.):
• Si se especificó el campo partitionByFields y el valor de [Link]
es “partition”:
• Se crea una progresión aritmética por cada combinación posible de
valores para los campos especificados en partitionByFields en vez
de una única progresión, tomando como primer término el valor
menor del campo especificado en fields para esa combinación de
valores.
• Luego, se siguen los mismos pasos que para [Link] igual a
full, pero con cada combinación posible de valores para esos
campos y su progresión aritmética asociada.
Sentencias MongoDB: Casos especiales de aggregate

• Agrupar por fecha:


– Si lo que se desea dentro de la etapa $group es agrupar por
fecha, el valor de la clave _id (si se agrupa por un único
campo) o de uno de los campos dentro del objeto que es valor
de la clave _id (si se agrupa por múltiples campos) debe ser un
atributo con clave igual a la palabra reservada $dateToString y
valor igual a un objeto con las siguientes dos claves:
• format: Su valor es una expresión String con el formato deseado de la
fecha reconocido por MySQL
• date: nombre de un campo de fecha en la colección
Sentencias MongoDB: casos especiales de aggregate

• Filtrar por desigualdad:


– Si se desea obtener resultados cuyo valor sea distinto, mayor o
menor que una expresión específica con la etapa $match, el valor
de la clave deseada para comparar debe ser igual a un objeto
JSON conteniendo un atributo con clave igual a una de las
siguientes palabras reservadas y valor igual al valor a comparar:
• $gt: Mayor que
• $gte: Mayor o igual que
• $lt: Menor que
• $lte: Menor o igual que
• $ne: Distinto de
Sentencias MongoDB: casos especiales de aggregate

• Filtrar por otros criterios:


– Dentro de la etapa $match, se admiten los siguientes
comparadores además de los listados en la diapositiva anterior:
• $not: Negación. Su valor debe ser un objeto JSON con cualquier
campo admitido por la etapa $match con un valor apropiado
• $exists: El campo existe en la colección o etapa anterior. Para este
criterio, se admiten valores true o false
• $type: El campo es de un tipo de dato específico (Int32, Int64, UInt32,
UInt64, String, Object, Array, etc.)
Sentencias MongoDB: Ejemplos de aggregate
• Contar todos los registros existentes en la colección orders
Sentencias MongoDB: Ejemplos de aggregate
• Obtener la suma de todos los valores de price existentes en orders
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la suma de todos los valores de price existentes en orders, agrupados por cada valor de
cust_id
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la suma de todos los valores de price existentes en orders, agrupados por cada valor de
cust_id y ordenados ascendentemente por el valor de cada suma.
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la suma de todos los valores de price existentes en orders, agrupados por cada valor de
cust_id y por cada fecha en el campo ord_date en formato AAAA-MM-DD.
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la cantidad de registros asociados a cada cust_id en orders de manera tal que esa
cantidad sea mayor que 1
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la suma de todos los valores de price existentes en orders, agrupados por cada
valor de cust_id y por cada fecha en el campo ord_date en formato AAAA-MM-DD para cada
dupla (cust_id, ord_date) cuya suma sea superior a 250.
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la suma de todos los valores de price existentes en orders, agrupados por cada valor de
cust_id para aquellos registros con status igual a ‘A’
Sentencias MongoDB: Ejemplos de aggregate

• Obtener la suma de todos los valores de price existentes en orders, agrupados por
cada valor de cust_id para aquellos registros con status igual a ‘A’ y cuya suma sea
mayor a 250
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en una base de datos SQL existen dos tablas llamadas orders y order_lineitem tal
que una columna en order_lineitem llamada order_id referencia a la columna id en orders y en esta
última tabla también existe una columna llamada cust_id para referirse al identificador de cada cliente
que realizó una orden. En un tiempo posterior, como parte de un plan de migración desde esa base de
datos hasta MongoDB, en esta última se crea una colección llamada orders de manera tal que los
registros de order_lineitem son embebidos en orders bajo la clave items, que admite un arreglo de
objetos. Se le pide al desarrollador generar una sentencia MongoDB que haga un join entre orders e
items para obtener la suma de cantidades de items por cada cliente.
Sentencias MongoDB: Ejemplos de aggregate
• Obtener la
cantidad de
todas las
combinaciones
posibles de
cust_id y
ord_date en
orders sin
considerar las
horas en
ord_date
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en una • Se le pide al programador obtener
base de datos MongoDB todos los documentos de la misma
colección más un campo adicional al
se creó una colección
documento embebido specs de cada
llamada vehicules con la documento en vehicles que lo
siguiente llamada a contenga. El campo debe llamarse
insertMany (que se verá fuel_type y su valor en todos los
más adelante) documentos embebidos debe ser
unleaded
Sentencias MongoDB: Ejemplos de aggregate
• El resultado de la operación de la diapositiva anterior es
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en una base de datos • Se le pide al programador obtener todos los
documentos de la misma colección más tres
MongoDB se creó una colección llamada campos adicionales. Los primeros dos, llamados
scores que contiene los siguientes totalHomework y totalQuiz deben contener
documentos) respectivamente la suma de todos los números en
el arreglo homework y el arreglo quiz de cada
documento. El tercer campo debe contener la
suma de los valores de los dos campos anteriores
y del campo extraCredit. (más tarde se verá más
en detalle los operadores como $sum y $add
Sentencias MongoDB: Ejemplos de aggregate
• El resultado de la operación de la diapositiva anterior es
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en una base de datos • Se le pide al programador, para cada uno de
MongoDB se creó una colección llamada los siguientes campos, rellenarlos con cero en
dailySales que contiene los siguientes cada documento en el que el campo está
documentos) ausente: bootSold, sandalsSold,
sneakersSold
Sentencias MongoDB: Ejemplos de aggregate

• La salida de la operación de la diapositiva anterior es


Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en una base de • Se le pide al programador rellenar el campo
datos MongoDB se creó una colección price para todos los stocks que no lo tienen,
aplicando interpolación lineal. Para ello, se
llamada stock, con los siguientes deben ordenar todos los documentos
documentos) ascendentemente por el campo time.
Sentencias MongoDB: Ejemplos de aggregate
• La salida de la operación de la diapositiva anterior es
Fíjese en los valores de price en los documentos en los que
estaba originalmente ausente.
Básicamente la interpolación lineal para este ejemplo consiste
en:
C: Campo ausente
D1:documento inmediatamente anterior a un documento con C
ausente
D2: documento inmediatamente superior a un documento con C
ausente que sea posterior a D1
X1: Valor de C en D1
X2: Valor de C en D2
D: Cantidad de documentos posteriores a D1 y anteriores a D2
INC=(X2 - X1)/(D+1)
I=1
Para cada documento Di entre D1 y D2, ambos exclusive:
Di.C=X1 + (INC * I)
I=I+1
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en una base de datos • Se le pide al programador rellenar el campo
MongoDB se creó una colección llamada score para todos los restaurantReviews que no
restaurantReviews, con los siguientes lo tienen, aplicando el último valor observado.
documentos) Para ello, se deben ordenar todos los
documentos ascendentemente por el campo
date.
Sentencias MongoDB: Ejemplos de aggregate
• La salida de la operación de la diapositiva anterior es
Fíjese en los valores de score en los documentos en los que
estaba originalmente ausente.
Básicamente el método L.O.C.F. para este ejemplo consiste en:
C: Campo ausente
D1:documento inmediatamente anterior a un documento con C
ausente
D2: documento inmediatamente superior a un documento con C
ausente que sea posterior a D1
X1: Valor de C en D1
Para cada documento Di entre D1 y D2, ambos exclusive:
Di.C=X1
Sentencias MongoDB: Ejemplos de aggregate
• Se le pide al programador obtener la suma de salarios
• Suponga usted que en una base de datos
por cada dupla (año fiscal – depto.) e insertar el
MongoDB llamada zoo se creó una colección resultado en una colección llamada budgets en otra
llamada salaries, con los siguientes base de datos llamada reporting. Si esa colección ya
documentos) existe, reemplazar todos los documentos que coincidan
en _id.
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que existe una colección llamada • Se le pide al programador que busque todos los votos
votes con los siguientes datos realizados entre el 7 y el 8 de mayo del 2019, la primera fecha
inclusive.
• Luego, del resultado, incluya los valores del campo date en
formato AAAA-MM en el campo _id e incluya los valores de los
campos thumbsup y thumbsdown sin cambios.
• Luego, inserte los documentos resultantes en la colección
monthlytotals. SI esa colección existe y contiene al menos un
documento que coincida en _id con los documentos a insertar,
actualice los valores de thumbsup y thumbsdown en
monthlytotals sumándole los valores de ambos campos en los
documentos a insertar
Sentencias MongoDB: Ejemplos de aggregate
• Para la siguiente colección...

• ¿Es correcta la siguiente sentencia? Si su respuesta es “no”, justifíquela

Respuesta: No. El documento con _id=4 no tiene un campo “name”.


Sentencias MongoDB: Ejemplos de aggregate
• En base al ejemplo de la diapositiva anterior, reintente la sentencia utilizando el operador
$mergeObjects

Aquí, dentro de $mergeObjects se usa como valor un arreglo de documentos donde el primero
es un documento “por defecto” con strings vacíos para first y last y el segundo es el documento
embebido en el campo name de collection. Así, si para un documento, el campo name no
existe, se agregará automáticamente con valor igual al primer elemento del arreglo.
• En base al ejemplo de la diapositiva anterior, reintente la sentencia utilizando la etapa
$match

• En base al ejemplo de la diapositiva anterior, reintente la sentencia utilizando el operador


$ifNull

Aquí, para aquellos documentos que no tengan el campo name, se agregará ese campo con un
documento que tenga un _id por defecto y el campo booleano missingName igual a true
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en la base de datos existe una colección llamada exhibits con los siguientes
documentos:

• Se le pide al programador obtener la cantidad de ocurrencias de cada elemento en el arreglo asignado al campo
tags de cada documento ordenando descendentemente el resultado

• Aquí, se tuvo que recurrir a la etapa unwind para generar un documento por cada elemento de tags. El resultado de $unwind son 4 documentos con _id=1, 2 con _id=2,
3 con _id=3, etc.
• El resultado de $sortByCount es:
Sentencias MongoDB: Ejemplos de aggregate
• Vuelva a intentar la operación del ejemplo de la diapositiva anterior,
pero esta vez omitiendo documentos repetidos
Sentencias MongoDB: Ejemplos de aggregate
• Suponga usted que en la base de datos existen • Se le pide al programador generar una colección
dos colecciones llamadas suppliers y que incluya únicamente el campo state entre los
warehouses, cada una con los siguientes documentos de suppliers y warehouses.
documentos:
Sentencias MongoDB: Ejemplos de aggregate
• Obtener un LEFT OUTER JOIN entre una colección llamada orders y una llamada inventory utilizando el campo item de orders y el
campo sku de inventory.
• A la derecha un posible resultado. Los campos dentro de cada elemento en inventory_docs corresponden a inventory y el resto a
orders.
Sentencias MongoDB: Ejemplos de aggregate
• Se tiene una colección llamada artwork con los siguientes
documentos
• Generar 4
buckets
agrupados por
el valor de price
usando la
granularidad por
defecto
• La solución está
en la diapositiva
siguiente
Sentencias MongoDB: Ejemplos de aggregate
Sentencias MongoDB: Ejemplos de aggregate
• Considerando la misma colección del ejemplo anterior, generar un
documento con los siguientes campos:
• price: Debe contener 4 buckets agrupados por el valor de price
usando la granularidad por defecto
• year: Debe contener 3 buckets agrupados por el valor de year. Por
cada uno, se debe mostrar la cantidad de documentos agrupados y un
arreglo con todos los valores encontrados del campo year entre todos
ellos.
• area: Debe contener 4 buckets agrupados por el producto entre los
valores de los campos height y width en el objeto dimentions. Por
cada uno, se debe mostrar la cantidad de documentos agrupados y un
arreglo con todos los valores del campo title entre todos ellos.
Sentencias MongoDB: Ejemplos de aggregate

El resultado está en la
diapositiva siguiente
Sentencias MongoDB: Ejemplos de aggregate
Sentencias MongoDB: Ejemplos de aggregate
• Considere la siguiente colección

• Genere buckets considerando el intervalo de valores de year_born entre 1840 y 1880 de 10 en 10


años.
• Cada bucket debe mostrar la cantidad de documentos agrupados y, a partir de esos documentos, un
arreglo de objetos en el que cada objeto tenga dos campos: el resultado de contatenar first_name y
last_name, separándolos por un espacio en blanco y el valor de year_born
• Considerar la posibilidad de que hayan documentos con el valor de year_born fuera del intervalo
mencionado al principio
• Mostrar solamente los buckets que tengan 3 o más documentos agrupados

La solución está en la diaposiva siguiente


Sentencias MongoDB: Ejemplos de aggregate

El resultado está en la
diapositiva siguiente
Sentencias MongoDB: Ejemplos de aggregate
Densificar la colección de la derecha
utilizando el campo timestamp de
manera tal que haya un incremento
de una hora para todos valores
comprendidos entre las 00:00
inclusive y las 08:00 exclusive del 18
de Mayo del 2021 sin particionar por
campos.
Sentencias MongoDB: Ejemplos de aggregate
Abajo, la solución. A la derecha, el
resultado
Sentencias MongoDB: Ejemplos de aggregate
Densificar la colección de la derecha utilizando el campo
altitude de manera tal que haya un incremento de 200 para
todos los valores de altitude actualmente en la colección.
Particionar por el campo variety.
Sentencias MongoDB: Ejemplos de aggregate
Abajo, la solución. A la derecha, el
resultado
Sentencias MongoDB: Ejemplos de aggregate
Si para el ejemplo anterior, el valor de
[Link] es partition en vez de full, el
resultado es
Sentencias MongoDB: operadores reconocidos por
aggregate
• Además de las etapas, dependiendo de la(s) etapa(s) utilizadas
en la(s) llamada(s) a aggregate desde una colección, se pueden
aplicar operadores a un campo o documento para obtener un
resultado deseado por el programador o uno admitido por una
etapa posterior.
• Al igual que las etapas, cada operador es una palabra reservada
reconocida por MongoDB a la que se le antepone un $. La
diferencia es que los operadores solo pueden utilizarse dentro de
los valores asociados a una etapa apropiada.
• Puede haber expresiones anidadas para que la salida de una sea
entrada de otra
Sentencias MongoDB: operadores reconocidos por
aggregate
• $abs:
– Permite obtener el valor absoluto de una expresión numérica
Sentencias MongoDB: operadores reconocidos por
aggregate
• $radiansToDegrees y $degreesToRadians:
– $radiansToDegrees permite obtener una expresión en grados de una expresión
en radianes mientras que con $degreesToRadians se hace la operación inversa
(grados a radianes)
– Por ejemplo, suponiendo que existe una variable llamada $pi con valor igual al
de la constante p, el resultado de expresar de radianes a grados la mitad de p,
es decir
{ $radiansToDegrees: { $divide: [$pi, 2] } },
resulta 90.
– Otro ejemplo, { $cos : { $degreesToRadians: 90 } } da como resultado un cero,
ya que al convertir el número 90 de grados a radianes se obtiene la mitad de p y
el coseno de ese valor es cero.
– Posteriormente se mostrará un ejemplo “real” de $radiansToDegrees.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $acos:
– Permite obtener el arcocoseno de una expresión
– La expresión o número debe estar comprendida entre 0 y 1.
– El resultado es expresado en radianes.
• $acosh:
– Permite obtener el arcocoseno hiperbólico de una expresión.
– La expresión o número debe ser positiva.
– Al igual que $acos, el resultado de $acosh es expresado en
radianes
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $acos y $radiansToDegrees
• Suponga usted que en • Se le pide al programador agregar a
todos los documentos obtenidos de la
la base de datos existe colección un campo llamado angle_a
una colección llamada conteniendo el arcocoseno de
cuociente, expresado en grados, entre
trigonometry con los side_b e hypotenuse.
siguientes datos
Sentencias MongoDB: operadores reconocidos por
aggregate
• $add:
– Permite obtener la suma entre dos o más expresiones
– Este operador admite un arreglo con todas las expresiones o
constantes a sumar.
– Cada expresión puede ser de un tipo numérico o uno de fecha
admitido por MongoDB como ISODate
• Si todos los elementos son números, se calcula una suma común y corriente.
• Si todos los elementos son fechas, se calcula la suma de la conversión en
formato UNIX de las fechas y se obtiene la conversión a ISODate o
equivalente del resultado
• Si al menos un elemento es un número y al menos un elemento es fecha,
cada elemento numérico es tratado como milisegundos a sumar a las fechas.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $add
• Suponga usted que en la base de datos se tiene una colección llamada sales con los siguientes
documentos

• Se le pide al programador obtener, por cada documento, el _id y el item de ese documento y, en un tercer campo llamado total,
la suma entre los valores de price y fee
Sentencias MongoDB: operadores reconocidos por
aggregate
• $addToSet:
– Este operador solo puede ser usado en la etapa $group.
– Toma todos los valores distintos posibles del campo específico
para cada combinación de campos por los cuales agrupar los
resultados y crea un campo nuevo cuyo valor es un arreglo con
los valores encontrados
– El valor para este operador debe ser un String con el nombre
del campo, anteponiéndole el $
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $addToSet
• Suponga usted que en la base de datos existe una colección llamada sales,
que tiene los siguientes documentos:

• Se le pide al programador que obtenga y agrupe todos los items vendidos para cada
combinación posible de la dupla “dia del año (1 a 365) / año” obtenible del campo date
Sentencias MongoDB: operadores reconocidos por
aggregate
• $allElementsTrue y $and:
– Ambos operadores admiten un arreglo como valor
– Ambos operadores devuelve true si todos los elementos del
arreglo al ser evaluados de manera booleana devuelven true o
si el arreglo es vacío.
– En MongoDB, una expresión dentro del arreglo asignado a
cualquiera de estos campos es evaluada a true si su valor es
true, 1, un arreglo vacío, un arreglo con elementos evaluados a
true o false o cualquier expresión distinta de null y undefined.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $allElementsTrue
• Suponga usted que en la • Se le pide al programador evaluar si todos los elementos en
base de datos existe una el arreglo asignado al campo responses de cada documento
colección llamada survey, son true o false. La salida debe contener solamente el campo
con los siguientes responses con su valor y el resultado de la evaluación en el
documentos: campo isAllTrue
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $allElementsTrue
• La salida de la operación anterior es
Sentencias MongoDB: operadores reconocidos por
aggregate
• $anyElementsTrue y $or:
– Ambos operadores admiten un arreglo como valor
– Ambos operadores devuelven true si el arreglo no está vacío y,
de todos los elementos del arreglo al ser evaluados de manera
booleana, al menos uno devuelva true.
– En MongoDB, una expresión dentro del arreglo asignado a
cualquiera de estos campos es evaluada a true si su valor es
true, 1, un arreglo con elementos evaluados a true o false o
cualquier expresión distinta de null y undefined.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $arrayElementAt:
– Este operador requiere de un arreglo de largo 2 como valor.
• El primer elemento del arreglo debe ser cualquier expresión que se considere un arreglo
• El segundo elemento debe ser un número entero
– Si el segundo elemento es positivo o cero, este operador obtiene el elemento
con el índice especificado partiendo desde el principio del arreglo (0 es el
primer elemento, 1 el segundo, etc.)
– Si el segundo elemento es negativo, este operador obtiene el elemento con
el valor absoluto del índice especificado partiendo desde el final del arreglo (-
1 es el último elemento, -2 el penúltimo, etc.)
– Si el índice está fuera del rango del arreglo (en ambos sentidos), el operador
no devuelve un valor
– Si el primer elemento es nulo o indefinido, el operador devuelve null.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $arrayElementAt
Sentencias MongoDB: operadores reconocidos por
aggregate
• $arrayToObject:
– Este operador convierte el arreglo asignado a uno o varios
documentos. Para que esto funcione, debe ocurrir una de las
siguientes situaciones:
• El arreglo asignado debe contener uno o varios arreglos de largo 2. Cada
elemento en el arreglo se convertirá en un documento con clave igual al
primer elemento en ese arreglo y valor igual al segundo elemento.
• El arreglo asignado debe contener uno o varios documentos con 2
campos llamados k y v.
– El campo k debe tener como valor la clave del documento a crear.
– El campo v debe ser igual al valor que tendrá el campo con el nombre especificado
por el campo k.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $arrayToObject
Sentencias MongoDB: operadores reconocidos por
aggregate
• $asin:
– Este operador admite una expresión numérica comprendida
entre -1 y 1 y obtiene el arcoseno de esa expresión en radianes.
• $asinh
– Este operador admite una expresión numérica y obtiene el
arcoseno hiperbólico de esa expresión en radianes.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $atan:
– Este operador admite una expresión numérica y obtiene el
arcotangente de esa expresión en radianes.
• $atan2
– Este operador admite un arreglo de largo 2 donde cada
elemento es una expresión numérica y el segundo elemento es
distinto de cero para obtener, en radianes, el arcotangente del
cuociente entre el primer y el segundo elemento. En otras
palabras, tiene la siguiente equivalencia:

{ $atan2: [$y, $x] } -> { $atan: { $divide: [ $y, $x ] } }


Sentencias MongoDB: operadores reconocidos por
aggregate
• $atanh:
– Este operador admite una expresión numérica comprendida entre -1 y 1 y obtiene el arcotangente
hiperbólica de esa expresión en radianes.
• $avg
– Este operador solo puede ser utilizado en las etapas $group (todas las versiones), $match (desde
la versión 3.3), $addFields, $replaceRoot (ambas desde la versión 3.4), $replaceWith y $set
(ambas desde la versión 4.2)
– Este operador puede admitir:
• Para todas las etapas excepto $group, un arreglo en el que todos sus elementos son expresiones
numéricas.
• Un String con el nombre del campo de un documento cuyo valor sea un arreglo de expresiones numéricas,
anteponiendo el $ a ese nombre.
• Un operador que admita al menos un campo numérico del documento.
– Este operador permite obtener el promedio entre todos los elementos del arreglo especificado
directamente con el operador o por medio del campo especificado.
– Si se encuentra un valor no numérico en el arreglo del cuál se obtendrá el primedio, ese valor es
ignorado.
– Si ningún elemento en el arreglo es numérico, con $avg se obtiene null.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $avg
• Considere la colección sales del ejemplo de $addToSet
• Se le pide al programador que obtenga, por cada item en la colección
– el promedio de montos donde, para cada documento, el monto es el producto entre los valores de
price y quantity. Ese promedio debe ser asignado a la clave avgAmount de los documentos de
salida.
– El promedio de cantidades, que debe ser asignado a la clave avgQuantity de los documentos de
salida
Sentencias MongoDB: operadores reconocidos por
aggregate
• $bitAnd, $bitOr, $bitXor:
– Cada uno de estos operadores admite un arreglo de 2 o más elementos
compuesto únicamente de expresiones numéricas enteras.
– Permite hacer, respectivamente un “Y lógico”, “O lógico” u “O exclusivo” a nivel
de bit entre las expresiones del arreglo
– Para una operación a nivel de bit entre 2 números, se siguen los siguientes
pasos:
• Se obtiene una representación binaria de cada elemento, rellenando con ceros a la
izquierda si es necesario para que todos los números binarios tengan igual cantidad de
dígitos
• Para cada posición “p” entre todos los dígitos, se hace la operación lógica entre el dígito
en la posición “p” del primer número con el dígito en esa misma posición para el segundo.
– $bitAnd: 1 si ambos dígitos son 1, 0 en caso contrario
– $bitOr: 1 si al menos uno de los dígitos es 1, 0 en caso contrario
– $bitXor: 0 si ambos dígitos son iguales, 1 en caso contrario.
• Luego, el número binario resultante es convertido a un número decimal.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $bitNot:
– Este operador admite una expresión númerica entera.
– Este operador obtiene la representación binaria de ese número,
convierte los unos en ceros y viceversa, convierte el número
binario resultante a su representación en decimal y se devuelve
el número resultante. En resumen, un “NO lógico” a nivel de bit
sobre el número recibido.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $bottomN:
– Este operador solo puede ser utilizado dentro de la etapa $group.
– Esta expresión ordena los resultados de la agrupación por uno o varios campos de
manera ascendente o descendente y, por cada valor distinto del(de los) campo(s)
utilizados para agrupar, obtiene los últimos N documentos en el orden especificado.
– El operador admite como valor un objeto JSON con exactamente las siguientes tres
claves:
• output: Su valor es un arreglo de Strings con los campos a desplegar, anteponiéndole a cada
uno el $
• sortBy: Su valor es un objeto JSON. En ese objeto, por cada campo de la colección o etapa
anterior por el que se desee hacer el ordenamiento, debe haber un campo con clave igual al
nombre de ese campo en la colección o etapa anterior (sin anteponer el $) y valor igual a 1
para orden ascendente o -1 para orden descendente.
• n: Su valor es una expresión numérica que sirve para indicar que se deben obtener los últimos
n resultados de la agrupación por cada valor o combinación de valores entre los campos a
agrupar
Sentencias MongoDB: operadores reconocidos por
aggregate
• $bottomN (cont):
– La salida es un arreglo de documentos en el que cada documento tiene _id
igual a los valores distintos de los campos utilizados a agrupar y un campo
de nombre arbitrario designado por el programador con valor igual a un
arreglo de arreglos con los valores de cada uno de los campos especificados
en output.
– El arreglo tendrá largo igual a la cantidad de valores o combinaciones
distintas de valores de los campos utilizados para agrupar
– El arreglo asignado al campo de nombre arbitrario tendrá largo n y cada
arreglo dentro de ese arreglo tendtá los valores de los campos especificados
en output de losl últimos documentos en la colección o etapa anterior en el
orden especificado por sortBy.
– Si para un campo en output, un documento en la colección o etapa anterior
no tiene ese campo, en la salida se le asignará null a ese campo.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de bottomN
• Suponga usted que existe • Se le pide al programador que, por gada
una colección llamada gameId, se obtenga los 3 playerId con el
gamescores con los menor puntaje y el score obtenido para
siguientes documentos: cada uno de ellos
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de bottomN
• La salida de la operación
de la salida anterior es

• El uso de la etapa $group con el


operador $bottomN para el
ejemplo equivale a la siguiente
sentencia SQL
Sentencias MongoDB: operadores reconocidos por
aggregate
• $bottom:
– Este operador solo puede ser utilizado dentro de la etapa $group.
– El valor para este operador debe ser un objeto JSON conteniendo
solamente las claves output y sortBy especificadas del mismo
modo que en $bottomN.
– Usar este operador equivale a usar el operador $bottomN con
n=1
– En consecuencia, en la salida, el valor asignado al campo de
nombre arbitrario será un arreglo con los valores de los campos
especificados en output en vez de un arreglo de arreglos.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $bsonSize:
– Este operador permite obtener el largo en bytes del objeto
BSON asignado.
– Si se desea obtener el largo en bytes de un documento
actualmente procesado, se debe utilizar la variable $$ROOT
– Ideal para probar tamaños de posibles salidas y evitar uso
excesivo de memoria
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $bsonSize
• Suponga usted que se tiene una colección llamada employees con los siguientes documentos
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $bsonSize
• Se le pide al programador que, por cada documento en la colección, se obtenga el
campo name y el tamaño actual del documento completo en bytes.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $ceil:
– Este operador admite una expresión numérica para obtener esa misma
expresión redondeada al entero mayor más cercano.
– Si la expresión recibida es un número entero, el resultado será el mismo
número.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $cmp:
– Este operador admite un arreglo de largo 2 para comparar sus
elementos por tipo de dato y/o por valor si uno es menor, mayor o igual
que el otro.
– Para la comparación por tipo de dato, sin tomar en cuenta tipos de
datos internos, MongoDB considera el siguiente orden de menor a
mayor: null, números, símbolos y Strings, Object, arreglo, datos
binarios, ObjectId, Boolean, Date, Timestamp, expresiones regulares.
– Si ambos elementos en el arreglo son del mismo tipo de dato, se hace
una comparación apropiada dependiendo de ese tipo.
– Este operador devuelve 1 si el primer elemento es mayor que el
segundo, -1 si el segundo es mayor que el primero o 0 si son iguales.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $cmp
• Suponga usted que se tiene una colección llamada
inventory con los siguientes documentos

• Se le pide al programador
obtener, por cada documento,
los valores de los campos
item y qty y, por cada par
“item-qty”, un 1 si qty>250,
un -1 si qty<250 o 0 si
qty=250
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $cmp
• Se le pide al programador obtener, por cada documento, los valores de los campos item
y qty y, por cada par “item-qty”, un nuevo campo llamado cmpTo250 cuyo valor es un 1
si qty>250, un -1 si qty<250 o 0 si qty=250
Sentencias MongoDB: operadores reconocidos por
aggregate
• $concat:
– Este operador admite un arreglo de Strings de largo mayor o
igual a 2 para concatenarlos en el orden dado por los índices
de cada elemento.
– Su resultado es un String con los Strings concatenados del
arreglo.
– Por ejemplo: { $concat: [‘Pan’, americano’] } resulta
“Panamericano”
– Si se desea concatenar strings con expresiones de otros tipos,
usar $convert o cualquier operador que empiece con $to
Sentencias MongoDB: operadores reconocidos por
aggregate
• $concatArrays:
– Este operador admite un arreglo de arreglos de largo mayor o
igual a 2 para concatenar cada arreglo en el orden determinado
por los índices del arreglo que los contiene.
– Los arreglos dentro del arreglo asignado a este operador no
tienen que ser del mismo tipo de dato o del mismo largo.
– Su resultado es un arreglo con los elementos de todos los
arreglos dentro del arreglo asignado a este operador, si alterar
su orden
– Por ejemplo: { $concatArrays: [ [1, 2, 3], [10, 9] ] } resulta
[ 1, 2, 3, 10, 9]
Sentencias MongoDB: operadores reconocidos por
aggregate
• $cond:
– Este operador admite uno de los siguientes 2 valores posibles:
• Un arreglo de largo 3 en el que el primer elemento es una expresión booleana y
el resto son expresiones cualquiera.
• Un objeto JSON con exactamente los siguientes 3 campos:
– if: Su valor debe ser una expresión booleana
– then: Su valor debe ser cualquier expresión
– else: Su valor debe ser cualquier expresión.
– Con ese operador, si el primer elemento del arreglo o el valor de campo if
es true, el valor devuelto será el del segundo elemento del arreglo o del
valor del campo then. En caso contrario, se devolverá el tercer elemento
del arreglo o el valor del campo else.
– El uso de este campo equivale al uso de CASE WHEN <if> THEN <true>
ELSE <false> END en SQL.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $type:
– Este operador admite una expresión cualquiera
– El resultado es un string utilizado por MongoDB para identificar
el tipo de dato que representa la expresión (véase “Tipos de
dato en MongoDB”)
Sentencias MongoDB: operadores reconocidos por
aggregate
• $convert y $toXXXX:
– El operador $convert sirve para convertir una expresión de su tipo de dato a otro
tipo de dato deseado.
– $convert admite un objeto JSON con los siguientes campos:
• input: Obligatorio. Su valor es la expresión a convertir
• to: Obligatorio. Su valor puede ser un String o un número para indicar el tipo de dato al
que se desee convertir el valor de input
• onError: Opcional. Su valor es cualquier expresión que se desee obtener si la conversión
falla. Si no está presente y la conversión falla, se lanzará un error.
• onNull: Opcional. Su valor es cualquier expresión que se desee obtener si el resultado de
la conversión es null y no se desea obtener ese resultado.
– Los operadores $toXXXX equivalen al uso de $convert con el campo to igual a
un valor apropiado sin incluir los campos onError y onNull
– La siguiente tabla mostrará los valores posibles del campo to y las equivalencias
a su correspondiente operador $toXXXX
Sentencias MongoDB: operadores reconocidos por
aggregate: Tabla de conversiones posibles
Valor posible de
to en $convert Operador
$toXXXX ¿Cuándo falla la operación?
equivalente
String Num.

“double” 1 $toDouble • Si input es un String no numérico o un String numérico de base


distinta de 10
• Si input es un Decimal o String numérico cuyo valor está fuera del
rango permitido para el tipo Double
“string” 2 $toString Nunca
“objectid” 7 $toObjectId Si input no es del tipo String y no representa un número hexadecimal
de exactamente 24 dígitos.
“bool” 8 $toBool Nunca
“date” 9 $toDate Si input es un String con un formato de fecha inválido o un Boolean
Sentencias MongoDB: operadores reconocidos por
aggregate: Tabla de conversiones posibles
Valor posible de
to en $convert Operador
$toXXXX ¿Cuándo falla la operación?
equivalente
String Num.

“int” 16 $toInt • Si input es un String no numérico o un String numérico de base


distinta de 10 que no representa un número entero o un Date o un
ObjectId
• Si input es un Double, Decimal, Long o String numérico cuyo valor
está fuera del rango permitido para el tipo Int
“long” 18 $toLong • Si input es un String no numérico o un String numérico de base
distinta de 10 que no representa un número entero o un ObjectId
• Si input es un Double, Decimal o String numérico cuyo valor está
fuera del rango permitido para el tipo Long
“decimal” 19 $toDecimal Si input es un String no numérico o un String numérico de base
distinta de 10 o un String numérico cuyo valor está fuera del rango
permitido para el tipo Decimal
Sentencias MongoDB: operadores reconocidos por
aggregate: Tabla de consideraciones al convertir
Valor posible de
to en $convert Operador
$toXXXX Resultado
equivalente
String Num.

“double” 1 $toDouble • Si input es de tipo Boolean, el resultado es 0 si input es false o 1 si


es true.
• Si input es de tipo Date, el resultado es la cantidad de milisegundos
transcurridos desde la medianoche del 1/1/1970 hasta la fecha
especificada
“string” 2 $toString Si input es de tipo Date, el resultado es la fecha en formato
AAAA-MO-DD’T’HH:mn:[Link]
“bool” 8 $toBool • Para tipos de dato numéricos, el resultado es true si input es 1 o 0
en caso contrario
• Para todos los demás tipos de dato, el resultado siempre será true
• Si input es null, el resultado también será null
Sentencias MongoDB: operadores reconocidos por
aggregate: Tabla de consideraciones al convertir
Valor posible de
to en $convert Operador
$toXXXX Resultado
equivalente
String Num.

“date” 9 $toDate • Para Strings con formato de fecha válido que omiten horas, minutos,
segundos y milisegundos, el resultado es la fecha representada por
input con dichos campos en cero.
• Si input es del tipo ObjectId, el resultado es el timestamp de input.
• Para todos los tipos de datos numéricos, si input es 0, el resultado
es un Date haciendo referencia a la medianoche del 1/1/1970.
Cualquier valor positivo de input se toma como la cantidad de
milisegundos transcurridos después de esa fecha y cualquier valor
negativo como la cantidad de milisegundos transcurridos antes.
Sentencias MongoDB: operadores reconocidos por
aggregate: Tabla de consideraciones al convertir
Valor posible de
to en $convert Operador
$toXXXX ¿Cuándo falla la operación?
equivalente
String Num.

“int” 16 $toInt Tiene el mismo comportamiento que $toDouble para input de tipo
booleano
“long” 18 $toLong Tienen el mismo comportamiento que $toDouble
“decimal” 19 $toDecimal
Sentencias MongoDB: operadores reconocidos por
aggregate
• $cos y $cosh:
– Estos operadores recibe como valor una expresión numérica
para obtener, respectivamente el coseno y el coseno
hiperbólico de esa expresión, asumiendo que está en radianes.
– Si usted desea obtener el coseno o el coseno hiperbólico de
una expresión que está en grados, asígnele a $cos o $cosh el
resultado del operador $degreesToRadians para esa expresión
(véase el segundo ejemplo en la descripción de
$radiansToDegrees y $degreesToRadians).
Sentencias MongoDB: operadores reconocidos por
aggregate
• $count:
– Este operador solo puede ser utilizado dentro de la etapa
$group.
– Permite obtener la cantidad de documentos para cada valor o
combinación de distintos valores del (de los) campo(s)
utilizado(s) para agrupar.
– Este operador solo puede admitir como valor un objeto vacío.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $count
• Suponga usted que en la base de • Se le pide al programador
datos hay una colección llamada obtener la cantidad de
cakeSales definida de la siguiente documentos en cakeSales por
manera: cada valor de state.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateAdd:
– Este operador admite un objeto JSON que contenga los siguientes campos:
• startDate: Obligatorio. Su valor debe ser una expresión de fecha (ISODate, Timestamp, etc.) al que
se le desee sumar un intervalo.
• unit: Obligatorio. Su valor debe ser un String indicando en qué unidades se incrementará la fecha
especificada en startDate. Puede ser uno y solo uno de los siguientes valores: “year” (año), “quarter”
(15 minutos), “week” (semana), “month” (mes), “day” (día), “second” (segundo), “minute” (minuto),
“milisecond” (milisegundo), “hour” (hora)
• amount: Obligatorio. Su valor debe ser una expresión numérica entera con la cantidad a aumentar
expresada en la unidad especificada en unit.
• timezone: Opcional. Indica en qué zona horaria se desea establecer la fecha resultante. Si se omite,
se asume la zona horaria UTC. Su valor debe ser un String válido en cualquiera de los siguientes
formatos:
– Identificador Olson. Ejemplo: “America/Santiago”, “GMT”
– Offset UTC (diferencia con respecto a UTC) que consiste en un + o un – seguido de la hora en uno y solo uno de
los siguientes formatos: HH:MM, HHMM o HH
– El resultado es una expresión Date con hora igual al resultado de incrementar el valor de
startDate en amount unidades expresadas en unit en la zona horaria especificada por
timezone o en UTC si timezone no está presente.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateAdd (cont.):
– Se tiene la siguiente advertencia con este operador: Si la fecha inicial es el
último día de Enero, Marzo, Mayo, Agosto u Octubre de un año cualquiera y
se desea incrementar esa fecha en un mes, el resultado será el último día
del mes siguiente y no el 31 de ese mes, ya que ese día no existe.
– Por ejemplo, el resultado de la siguiente operación es el 30 de Noviembre del
2020 a las 12:10:05 en la zona UTC:
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateDiff:
– Este operador admite un objeto JSON que contenga los siguientes campos:
• startDate: Obligatorio. Su valor debe ser una expresión de fecha indicando la fecha inicial.
• endDate: Obligatorio. Su valor debe ser una expresión de fecha indicando la fecha final.
• unit: Obligatorio. Debe ser definido del mismo modo que en el operador $dateAdd.
• timezone: Opcional. Debe ser definido del mismo modo que en el operador $dateAdd.
• startOfWeek: Opcional. Solo se aplica si el valor de unit es “week” para indicar qué día de
la semana se debe considerar como el primero. Su valor debe ser un String indicando el
día de la semana en inglés o sus primeras 3 letras. Si se omite, se asume que el primer
día de la semana será Domingo.
– El resultado es un número entero (aproximado de ser necesario) con la
diferencia entre startDate y endDate expresada en la unidad especificada por
unit.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $dateDiff
• Suponga usted que en la base de datos existe una colección
llamada subscriptions con los siguientes documentos:
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $dateDiff
• Se le pide al programador obtener una colección en el que cada documento debe tener los valores de start y
end y tres campos nuevos, uno llamado years, uno llamado months y uno llamado days con con la diferencia
en años, meses días, respectivamente, entre los primeros dos campos. Escribir manualmente una tabla en
Excel con los resultados campo por campo
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromParts:
– Este operador admite un objeto JSON que contenga los siguientes campos:
• year: Obligatorio si no está presente la clave isoWeekYear; en caso contrario, no debe
incluirse. Su valor debe ser un número entero comprendido entre 1 y 9999 para indicar el año
o habrá un error.
• isoWeekyear: Obligatorio si no está presente la clave year; en caso contrario, no debe incluirse.
Su valor debe cumplir con las mismas condiciones que para year.
• month: Opcional. Solo puede estar presente si el campo year está presente. Debe ser un
número entero comprendido entre 1 y 12 para indicar el mes o se aplicará la diferencia para el
cálculo de la fecha. Si no está presente, se asume Enero (1)
• isoWeek: Opcional. Solo puede estar presente si el campo isoWeekYear está presente. Debe
ser un número entero comprendido entre 1 y 53 para indicar la semana dentro del año o se
aplicará la diferencia para el cálculo de la fecha. Si no está presente, se asume la primera
semana de enero.
• day: Opcional. Solo puede estar presente si el campo year está presente. Debe ser un número
entero comprendido entre 1 y 31 para indicar el día del mes o se aplicará la diferencia para el
cálculo de la fecha. Si no está presente, se asume el primer día.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromParts:
– Este operador admite un objeto JSON que contenga los siguientes campos
(cont):
• isoDayOfWeek: Opcional. Solo puede estar presente si el campo isoWeekYear está
presente. Debe ser un número entero comprendido entre 1 y 7 para indicar el día de la
semana o se aplicará la diferencia para el cálculo de la fecha. Si no está presente, se
asume día Lunes (1)
• hour: Opcional. Debe ser un número entero comprendido entre 0 y 23 para indicar la hora
del día o se aplicará la diferencia para el cálculo de la fecha. Si no está presente, se
asume las cero horas.
• minute: Opcional. Debe ser un número entero comprendido entre 0 o 59 para indicar el
minuto de la hora o se aplicará la diferencia para el cálculo de la fecha. Si no está
presente, se asume el minuto cero.
• second: Opcional. Debe ser un número entero comprendido entre 0 y 59 para indicar los
segundos del minuto o se aplicará la diferencia para el cálculo de la fecha. Si no está
presente, se asume el segundo cero.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromParts:
– Este operador admite un objeto JSON que contenga los siguientes campos (cont):
• millisecond: Opcional. Debe ser un número entero comprendido entre 0 y 999 para indicar los
milisegundos del segundo o se aplicará la diferencia para el cálculo de la fecha. Si no está presente,
se asume el milisegundo cero.
• timezone: Opcional. Debe ser definido del mismo modo que en el operador $dateAdd.
– El resultado con este operador es una variable Date indicando la fecha especificada a partir
de los valores en las claves presentes del objeto de entrada.
– Por ejemplo, la siguiente operación resulta en una variable ISODate indicando el mediodía
del 1 de Febrero del 2018 en la zona horaria UTC, debido que al indicar mes 14, se avanza
un año y se aplica el mes correspondiente a la diferencia entre el mes ingresado y 12, que en
este caso resulta 2 por lo que se indica que el mes será Febrero del año posterior al 2017:

{ $dateFromParts: { 'year' : 2017, 'month' : 14, 'day': 1, 'hour' : 12 } }


Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromString:
– Este operador admite un objeto JSON que contenga los siguientes
campos:
• dateString: Obligatorio. Su valor debe ser un String para indicar la fecha deseada.
• format: Opcional. Su valor debe ser un String conteniendo el formato de fecha en el
cual está expresado dateString. Si no se incluye, se asume el formato “%Y-%m-
%dT%H:%M:%S.%LZ”
• timezone: Opcional. No debe incluirse si dateString lleva una Z al final. Debe ser
definido del mismo modo que en el operador $dateAdd.
• onError: Opcional. Puede ser de cualquier tipo de dato para indicar el valor a obtener
en caso de que la conversión falla. Si no está presente y la conversión falla, se
obtendrá un error.
• onNull: Opcional. Puede ser de cualquier tipo de dato para indicar el valor a obtener
en caso de que el resultado de la conversión sea null y no se desea obtener ese
valor.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromString:
– Para el campo format, se admiten las siguientes expresiones dentro
del String. Cualquier otro caracter distinto a ese se toma de manera
literal (por ejemplo, la letra T, el guion o los dos puntos):
• %b: Primeras 3 letras del mes en inglés con todas las letras minúsculas.
• %B: Nombre completo del mes en inglés con la primera letra mayúscula.
• %d: Día del mes con 2 dígitos (se rellena con ceros si es necesario)
• %G: Año de acuerdo al estándar ISO 8601
• %H: Hora del día con 2 dígitos entre 0 y 23 (se rellena con ceros si es
necesario).
• %j: Día del año con 3 dígitos (se rellena con ceros si es necesario)
• %L: Milisegundo con 3 dígitos (se rellena con ceros si es necesario)
• %m: Mes con 2 dígitos (se rellena con ceros si es necesario)
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromString:
– Para el campo format, se admiten las siguientes expresiones dentro del
String. Cualquier otro caracter distinto a ese se toma de manera literal
(por ejemplo, la letra T, el guion o los dos puntos) (cont.):
• %M: Minuto con 2 dígitos (se rellena con ceros si es necesario)
• %S: Segundo con 2 dígitos (se rellena con ceros si es necesario)
• %u: Día de la semana de acuerdo al estándar ISO 8601 (1=Lunes, 7=Domingo)
• %U: Semana del año con 2 dígitos (se rellena con ceros si es necesario)
• %V: Semana del año de acuerdo al estándar ISO 8601
• %w: Día de la semana (0=Domingo, 6=Sábado)
• %Y: Año con 4 dígitos (se rellena con ceros si es necesario)
• %z: Offset de zona horaria desde UTC en formato HH:MM anteponiendo el + o el
-
• %Z: Offset de zona horaria desde UTC en minutos anteponiendo el + o el -
• %%: Porcentaje
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateFromString:
– En caso de éxito, se obtiene una variable ISODate indicando la
fecha especificada en dateString. Si format está presente, se
tomará en cuenta el formato de fecha especificado para la
conversión.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de dateFromString
• Suponga usted que se tiene una colección llamada logmessages con los siguientes documentos

• Se le pide al programador obtener, para cada documento en la colección, un documento de salida


conteniendo los campos _id y date, asignado a este último la conversión a ISODate del campo date original
asumiendo el formato por defecto y la zona horaria “America/New York” o null si el date original no está
presente
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateSubstract:
– Este operador admite un objeto JSON con los mismos campos que en $dateAdd,
pero $dateSubstract retrocede la fecha especificada en startDate una cantidad
amount especificada en la unidad unit.
• $dateToParts:
– Este operador admite un objeto JSON con los siguientes campos:
• date: Obligatorio. Puede ser de tipo Date, Timestamp u ObjectID para indicar la fecha a
convertir
• timezone: Opcional. Debe ser definido del mismo modo que en el operador $dateAdd.
• iso8601: Opcional. Debe ser de tipo booleano para indicar si se aplica el estándar ISO
8601 a la conversión de date. Si no está presente, se asume false.
– El resultado de esta operación es un objeto JSON admitible como valor para el
operador $dateFromParts. Algunas claves de los campos en el objeto
dependerán del valor de la clave iso8601 (véase $dateFromParts para más
detalles).
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dateToString:
– Este operador admite un objeto ISO con los siguientes campos:
• date: Obligatorio. Puede ser de tipo Date, Timestamp u ObjectID para
indicar la fecha a convertir
• format: Opcional. Indica el formato en el cuál debe expresarse date.
Debe estar definido del mismo modo y tiene el mismo valor por defecto
que en $dateFromString
• onNull: Opcional. Debe ser definido del mismo modo que en el
operador $dateFromString.
– El resultado de esta operación es un String con la
representación de date en el formato especificado en format.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $dayOfMonth, $dayOfWeek y $dayOfYear:
– Estos 3 operadores admiten uno de los siguientes valores posibles:
• Una variable Date, Timestamp u ObjectID para indicar la fecha
• Un objeto JSON con los siguientes campos:
– date: Obligatorio. Su valor debe ser una variable de cualquiera de los tipos de dato indicados
arriba.
– timezone: Opcional. Debe ser definido del mismo modo que en $dateAdd
– El resultado de estas 3 operaciones es un número entero comprendido
entre 1 y 31 para $dayOfMonth, entre 1 y 7 para $dayOfWeek o entre 1 y
365 para $dayOfYear indicando el día del mes, de la semana o del año,
respectivamente, obtenido desde date aplicando la zona horaria en
timezone de estar presente.
– Para el caso de $dayOfWeek, un 1 significa Domingo y un 7 significa
Sábado.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $divide:
– Este operador admite un arreglo numérico de largo 2 para obtener la división
entre el primer y el segundo elemento
– El segundo elemento del arreglo no debe ser un cero.
• $eq y $ne:
– Estos operadores admiten un arreglo de largo 2 con expresiones de
cualquier tipo
– El valor obtenido con $eq es true si ambos elementos del arreglo tienen el
mismo tipo y el mismo valor, o false en caso contrario.
– Con $ne, se obtiene el resultado inverso.
• $exp:
– Este operador admite una expresión númerica cualquiera para obtener el
resultado de elevar la constante e (2.718281828...) a la expresión
especificada.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $gt, $gte, $lt, $lte:
– Estos operadores admiten un arreglo numérico de largo 2 para comparar ambos
elementos de este
– El resultado es true si el primer elemento es, respectivamente, “mayor”, “mayor o
igual”, “menor” o “menor o igual” que el segundo o false en caso contrario.
• $filter
– Este operador admite un objeto JSON con los siguientes campos:
• input: Obligatorio. Su valor debe ser un arreglo de largo cualquiera con contenido de cualquier
tipo para cada elemento.
• as: Opcional. Su valor debe ser un String con un nombre arbitrario de variable que será
utilizado por MongoDB para hacer referencia a cada elemento de input. Si no está presente, se
asume que el nombre de la variable es this.
• cond: Opcional. Su valor debe ser una expresión booleana. Esta expresión será utilizada para
evaluar cada elemento de input por medio de la variable de nombre especificado por as o this.
• limit: Opcional. Su valor debe ser una expresión numérica entera indicando la cantidad máxima
de elementos a obtener de input. Si no está presente, se asume que no hay límite máximo.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $filter (cont.)
– El resultado de la operación es un arreglo de largo menor o igual al de
input o al del valor de limit con “todos” los elementos de este para los
cuales la expresión especificada en cond resulta verdadera.
– Si limit está presente, solo los primeros limit elementos se considerarán.
– Si el valor de cond es una operación que devuelve un valor booleano,
para que esa operación se resuelva en función de la variable especificada
por as, se debe incluir esa variable como un String anteponiendo $$.
– Si todos los elementos de input son objetos JSON o BSON, a la variable
especificada en as (anteponiéndole el $$), se le puede agregar un
caracter punto y el nombre de un campo en el objeto para acceder al
valor de ese objeto al momento de evaluar la expresión especificada en
cond.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de filter
Sentencias MongoDB: operadores reconocidos por
aggregate
• $first y $last
– Estos operadores solo pueden ser utilizados en cualquiera de los siguientes
casos:
• Etapa $group posterior a una etapa $sort
• Etapa $group posterior a otra etapa $group en la que se utilizó el operador $bottomN
• Etapa $group sobre una colección o etapa anterior ya ordenada.
– Estos operadores admiten un String cuyo valor es el nombre de un campo
presente en la colección o etapa anterior, anteponiéndole el $
– Asumiendo que la colección o el resultado de la etapa anterior ya está ordenada,
el resultado de cada operador es un arreglo de documentos de largo igual a la
cantidad de valores o combinaciones de valores distintos presentes en el(los)
campo(s) especificado(s) por el campo _id de la etapa $group, es decir, el(los)
campo(s) utilizados para agrupar y, por cada uno de esos valores, el campo
especificado correspondiente, respectivamente, al primer y al último documento
con los valores de ese(os) campo(s)
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $first
• Considere la siguiente colección

• Se le pide obtener ordenar ascendentemente la colección por item y por date y del resultado, por cada valor distinto de item,
obtener ese valor y la fecha del primer item vendido con ese valor en el campo firstSale.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $firstN y $lastN
– Estos operadores pueden ser utilizados de dos maneras diferentes:
• Para la primera:
– el valor a asignar a cualquiera de estos operadores debe ser un objeto JSON con los
siguientes dos campos obligatorios:
» input: Debe ser definido del mismo modo que en el operador $first
» n: Cantidad de documentos a obtener por cada valor del campo especificado por
input. Debe ser un entero positivo.
– Estos operadores son similares respectivamente a $first y $last con la diferencia de que
$firstN y $lastN permiten obtener el valor de los campos especificados en input a partir de
los primeros n documentos en el caso de $firstN o los últimos en el caso de $lastN
(asumiendo que ya están ordenados previamente) por cada valor distinto del o de los
campos usados para agrupar en la etapa $group
– El resultado es un arreglo de largo n, donde cada elemento del arreglo es un “sub-arreglo”
de largo 2 conteniendo el nombre del campo especificado en input y el valor de ese
campo obtenido del documento i-esimo con i entre 1 y n.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $firstN y $lastN
– Estos operadores pueden ser utilizados de dos maneras
diferentes: (cont.):
• Para la segunda:
– el valor a asignar a cualquiera de estos operadores debe ser un objeto JSON con los
siguientes dos campos obligatorios:
» input: Debe ser un arreglo de largo mayor o igual que 1
» n: Cantidad de documentos a obtener del arreglo especificado en input. Debe ser
un número positivo.
– Para cada operador, en este caso, el resultado es un arreglo conteniendo los
primeros o los últimos n elementos obtenidos de input. Si n es mayor o igual que el
largo del arreglo, entonces se obtiene el arreglo completo.
• Ejemplo: { $firstN: { input: [ ‘p’, ‘o’, ‘l’, ‘a’, ‘r’ ], n: 3 } } resulta
[ ‘p’, ‘o’, ‘l’, ‘a’, ‘r’ ]
Sentencias MongoDB: operadores reconocidos por
aggregate
• $floor:
– Este operador admite una expresión numérica cualquiera para
obtener esa misma expresión redondeada al entero menor más
cercano. Si la expresión recibida es un número entero,
entonces el resultado es el mismo número.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $trunc:
– Similar a $floor, pero $trunc admite un arreglo numérico de
largo 2 indicando:
• En el primer elemento, el número a truncar.
• En el segundo, qué dígitos truncar.
– Si es positivo, será la cantidad de decimales a conservar después del caracter “.”.
– Si es negativo, será la cantidad de dígitos enteros a partir del de la unidad que
serán reemplazados por ceros, además de que se removerán todos los
decimales.
– Si es cero, se obtiene el mismo comportamiento que $floor.
Sentencias MongoDB: operadores reconocidos por
aggregate. Ejemplo de $trunc
• Considere la siguiente colección: • Se pide truncar todos los números en value:
– Un decimal
– Todos los decimales
– Todos los decimales y reemplazar el dígito de la
unidad por un cero.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $function
– Este operador permite definir una función personalizada con cero o varios
parámetros de entrada para poder realizar operaciones que ningún
operador definido por MongoDB puede realizar
– $function requiere de un objeto BSON con los siguientes campos
obligatorios:
• args: Un arreglo de largo cualquiera conteniendo parámetros de entrada a ser
recibidos por la función. Se puede hacer referencia en cada elemento a un
campo de la colección o etapa anterior con el nombre de ese campo
anteponiéndole el $
• lang:Un String indicando lenguaje en que está definida la función. Hasta la fecha,
el único valor permitido para este campo es “js” (JavaScript)
• body: Una función definida en el lenguaje especificado en lang.
– Para el caso de JavaScript, el formato de una función debe ser:
function(<parametro(s)>){ //cuerpo }
Sentencias MongoDB: operadores reconocidos por
aggregate
• $function (cont.)
– Este operador presenta las siguientes restricciones:
• Para que funcione, es necesario que en MongoDB esté habilitada la opción “Server
Side Scripting” (Ejecución de scripts en el lado del servidor).
– En versiones más recientes, esta opción está habilitada por defecto.
• No sirve para expresiones de consultas de validación de esquemas.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $function
• Considere la siguiente colección

• Se le pide al programador obtener todos los documentos de la colección más dos


campos adicionales:
– Uno llamado isFound cuyo valor es true si el campo name, codificado con el algoritmo MD5
con codificación hexadecimal sea exactamente igual a 15b0a220baa16331e8d80e15367677ad
– El otro, llamado message, debe tener como valor un String con el mensaje “Hello <nombre>, your
total score is <total>”, donde nombre es el valor del campo name y total es la suma de todos los
valores en scores.
• Usar funciones javascript para asignar valores a los campos nuevos.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $function
• Considere la siguiente colección

• Se le pide al programador obtener todos los documentos de la colección más dos


campos adicionales para cada uno:
– Uno llamado isFound cuyo valor es true si el campo name, codificado con el algoritmo MD5
con codificación hexadecimal sea exactamente igual a 15b0a220baa16331e8d80e15367677ad
– El otro, llamado message, debe tener como valor un String con el mensaje “Hello <nombre>, your
total score is <total>”, donde nombre es el valor del campo name y total es la suma de todos los
valores en scores.
• Usar funciones javascript para asignar valores a los campos nuevos.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $function
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $function
La salida de la operación anterior es
Sentencias MongoDB: operadores reconocidos por
aggregate
• $literal
– Este operador recibe un String cualquiera que empieza con el
caracter $.
• Caracteres que empiezan con $ en MongoDB representan variables,
nombres de campos en colecciones o en etapas anteriores, etapas y
otros operadores.
– La salida de este operador es el mismo String tratado como
literal en vez de una palabra reservada o campo.
– Para un ejemplo de este operador, véase el ejemplo de
$getField
Sentencias MongoDB: operadores reconocidos por
aggregate
• $getField
– Este operador recibe un objeto JSON con los siguientes 2 campos:
• field: Obligatorio. Debe ser un String indicando el campo cuyo valores se
obtendrán desde la colección o etapa anterior.
• input: Opcional. Indica desde dónde se obtendrán los valores del campo
especificado en field.
– Su valor debe ser un objeto, un documento o arreglo de documentos embebidos o una de las
siguientes palabras reservadas: missing, null, undefined. De lo contrario, se obtendrá un error.
– Si se omite este campo, se asume la misma colección o la etapa anterior ($$CURRENT)
– Este operador es utilizado dentro de un operador $expr, normalmente
para comparar campos, como lo indica el siguiente ejemplo
– El valor obtenido para cada documento es el valor del campo especificado
a menos que el valor de input sea missing, null o undefined en cuyo caso
se obtendrá missing.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $getField
• Considere la colección inventory con los siguientes documentos

• Se pide obtener todos los documentos cuyo valor de $price sea mayor que 200
Sentencias MongoDB: operadores reconocidos por
aggregate
• $year, $month, $hour, $minute, $second y $millisecond
– Estos operadores reciben una expresión de tipo Date para
obtener, respectivamente, la porción de año (número con 4
dígitos), mes (entre 1 y 12), hora (entre 0 y 23), minuto (entre 0
y 59), segundo (entre 0 y 59) y milisegundo (entre 0 y 999)
desde esa expresión.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $ifNull
– Este operador recibe un arreglo de largo mayor o igual a 2 en
versiones de MongoDB superiores a 4.4. En las demás
versiones, el largo debe ser exactamente 2.
– Este operador recorre todos los elementos desde el primero
hasta el penúltimo hasta encontrar el primer elemento distinto
de null, missing o undefined y el valor de ese elemento es
obtenido. Si el valor de todos esos elementos es null, en vez de
eso, se obtiene el valor del último elemento.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $in
– Este operador recibe un arreglo de largo exacto 2, de manera
tal que el primer elemento sea de cualquier tipo y el segundo
sea un arreglo de elementos de cualquier tipo
– Se obtiene true si el primer elemento pertenece al segundo o
false en caso contrario.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $indexOfArray
– Este operador admite un arreglo de largo entre 2 y 4:
• El primer elemento debe ser el arreglo desde donde se busca un
elemento
• El segundo elemento debe ser el elemento a buscar en el arreglo del
primer elemento
• Si existe un tercer elemento, debe ser un número entero positivo
indicando el índice en el arreglo desde el cual buscar el elemento. Si
se omite se asume que se buscará desde el principio del arreglo.
• Si existe un cuarto elemento, debe ser un número entero positivo
indicando el índice en el arreglo hasta el cual buscar el elemento. Si se
omite, se asume que se buscará hasta el final del arreglo
Sentencias MongoDB: operadores reconocidos por
aggregate
• $indexOfArray (cont)
– Si el primer elemento del arreglo recibido por el operador no es nulo y es un arreglo,
y el segundo elemento del arreglo existe entre los índices especificados en el tercer
y/o cuarto elemento (o en todo el arreglo si ninguno de estos elementos existe), se
devuelve el índice de la primera ocurrencia del elemento encontrado en el arreglo.
– Si el primer elemento del arreglo recibido por el operador no es nulo y es un arreglo,
y el segundo elemento del arreglo no existe entre los índices especificados en el
tercer y/o cuarto elemento (o en todo el arreglo si ninguno de estos elementos
existe), o si el tercer y cuarto elemento existen y el tercer elemento es menor que el
cuarto, se obtiene -1
– Si el primer elemento del arreglo recibido por el operador es nulo o es un campo que
no existe en el documento de entrada, se obtiene null
– Si el primer elemento no es nulo pero no es un arreglo, o si el tercer y/o cuarto
elemento existen y son negativos, se obtiene un error.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplos de $indexOfArray
Sentencias MongoDB: operadores reconocidos por
aggregate
• $indexOfBytes
– Este operador se comporta de igual manera que $indexOfArray con la diferencia de que los dos primeros
elementos del arreglo recibido deben ser Strings y el resultado debe ser la primera ocurrencia del segundo
elemento en el primero en caso de que ambos elementos sean Strings y no sean nulos.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $indexOfCP
– Igual que $indexOfBytes, pero el valor devuelto es índice de “code point” UTF-8 con la primera
ocurrencia del elemento encontrado. Úsese este operador si los Strings tienen acentos.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $isArray
– Este operador recibe un arreglo de largo 1 para obtener true si el
elemento dentro de ese arreglo es otro arreglo (de cualquier largo y tipo)
o false en caso contrario

• $isNumber
– Este operador recibe un elemento cualquiera para obtener true si ese
elemento es de un tipo de dato numérico o false en caso contrario
Sentencias MongoDB: operadores reconocidos por
aggregate
• $isoDayOfWeek, $isoWeek e $isoWeekYear
– Estos operadores pueden recibir uno de los siguientes valores
posibles:
• Una expresión de tipo Date, asumiendo que está en la zona horaria UTC
• Un objeto JSON con los siguientes campos:
– date: Obligatorio. Debe ser una expresión de tipo Date
– timezone: Opcional. Debe ser definido del mismo modo que en el operador $dateAdd
– Los resultados para cada operador son un número indicando
según el estándar ISO 8601, respectivamente, el día de la
semana (entre 1 y 7 con 1=Lunes y 7=Domingo), la semana del
año (entre 1 y 53) y el año.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $let
– Este operador admite un objeto JSON con los siguientes campos:
• vars: Obligatorio. Su valor debe ser un objeto JSON con uno o varios campos
donde cada campo puede tener una clave y valor cualquiera. El valor para
cada clave puede ser una expresión constante o un campo o variable
definido antes de este operador, anteponiéndole el $$. Cada campo
representa una variable.
• in: Cualquier expresión utilizada para la evaluación en función de las
variables definidas en vars (normalmente el uso de un operador). Cada
variable en la expresión debe aparecer como un String anteponiéndole el $$
– El resultado de este operador es el resultado de la evaluación de la
expresión especificada en in.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $let
• Considere una colección llamada sales con los siguientes documentos.

• Se le pide al programador obtener, por cada documento, la _id del documento y un campo nuevo
llamado finalTotal cuyo valor debe ser la suma entre price y tax multiplicada por 0.9 si applyDiscount
es true o por 1 en caso contrario.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $log, $ln y $log10
– $log operador admite un arreglo de números de largo 2 para
obtener el logaritmo del primer número en base igual al segundo.
Ambos números deben ser positivos y el segundo debe ser mayor
que 1.
– $ln admite una expresión numérica positiva para obtener el
logaritmo natural de esa expresió[Link] otras palabras, es
equivalente a
{ $log: [ <num>, { $exp: 1 } ] }
– $log10, al igual que $ln, admite un número positivo. Con este
operador se obtiene el logaritmo en base 10 del número ingresado.
Es decir, es equlvanete a { $log: [ <num>, 10 ] }
Sentencias MongoDB: operadores reconocidos por
aggregate
• $trim, $ltrim y $rtrim
– Estos operadores reciben un objeto JSON con los siguientes campos:
• input: Obligatorio. Debe ser un String cualquiera.
• chars: Opcional. Debe ser un String cualquiera. Si se omite, se asume el espacio en blanco y
caracteres especiales como el tabulador y el salto de línea.
– Para $ltrim y $rtrim, estos operadores recorren input desde el principio en el caso de
$ltrim o desde el final en el caso de $rtrim hasta encontrar el primer caracter distinto de
cualquiera de los caracteres en chars o el espacio en blanco. Luego se obtiene el valor
de input sin los caracteres recorridos presentes en chars o, si chars no está presente, sin
el espacio en blanco ni caracteres especiales como el salto de línea y el tabulador.
– Para $trim, este operador es equivalente a usar $ltrim sobre el resultado de $rtrim y
viceversa, es decir, remueve los caracteres especificados del principio y del final del
String
Sentencias MongoDB: operadores reconocidos por
aggregate
• $map
– Este operador admite un objeto JSON con los siguientes campos:
• input: Obligatorio. Debe ser un arreglo de largo y tipo(s) cualquiera
• as: Opcional. Debe ser un String con el nombre de una variable a la que se le
asignará cada elemento en input. Si se omite, se asume que la variable se
llamará this.
• in: Obligatorio. Debe ser una expresión a evaluar (normalmente una operación)
en función de la variable especificada en as o de this. La variable debe aparecer
en la expresión como un String anteponiéndole el $$.
– El resultado de la operación es un arreglo del mismo largo que input en
el que el elemento i-ésimo del arreglo obtenido es el resultado de la
evaluación especificada en in para el elemento i-ésimo en input.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de Map
• Considere la • Se le pide obtener un arreglo de documentos
siguiente conteniendo, por cada documento, una _id por defecto y
un campo llamado adjustedGrades igual al mismo
colección arreglo que quizzes, pero sumándole 2 a cada elemento.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $max y $min
– Estos operadores solo pueden ser utilizados en cualquiera de las
siguientes etapas: $addFields, $replaceRoot (ambas desde la
versión 3.4), $set (ambas desde la versión 4.2), $match (desde la
versión 3.3, dentro del valor del operador $expr), $replaceWith
(desde la versión 3.3) y $group (todas las versiones).
– También pueden ser utilizados en estas etapas, pero ninguna de
ellas será vista en este documento debido a su complejidad, por
lo que usted debe revisar la documentación de MongoDB:
$bucket, $bucketAuto (excepto versión 3.2 y anteriores) y
$setWindowFields (desde la versión 5.0)
Sentencias MongoDB: operadores reconocidos por
aggregate
• $max y $min
– Estos operadores admiten una simple expresión o un arreglo de
expresiones, dependiendo de la etapa donde se utilizarán.
– En las etapas $group y $setWindowFields, este operador es utilizado para
comparar todos los valores de una expresión en función de uno o más
campos que no sean los especificados en el campo _id de esas etapas y
se obtiene el máximo entre todos ellos para cada valor obtenido de _id. Si
la expresión utilizada es un arreglo, se comparará el arreglo completo y
no cada uno de sus elementos.
– En las demás etapas, si el valor recibido es un arreglo, se obtiene el valor
máximo entre todos sus elementos. Si ese arreglo contiene al menos un
arreglo, cada arreglo dentro del arreglo se toma como un todo y no se
recorren sus elementos.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $max en $project
• Considere una colección llamada students con los siguientes documentos:

• Se le pide obtener, por cada documento, el _id del documento y 3 campos nuevos. El primero, llamado
quizMax, debe tener el máximo valor entre todos los de quizzes. El segundo, labMax, debe tener el máximo
valor entre todos los de labs. El tercero, examMax, debe tener el máximo entre el valor de final y el de
midterm.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $min en $group
• Considere una colección llamada sales con los siguientes documentos:

• Se le pide obtener el mínimo valor de quantity para cada uno de los items existentes en la
colección
Sentencias MongoDB: operadores reconocidos por
aggregate
• $maxN y $minN
– Estos operadores deben admitir un objeto JSON con los siguientes dos campos.
– input: Obligatorio. Puede tener uno de los siguientes dos valores posibles:
» Una expresión en función de uno o varios campos de la colección o etapa anterior. En este caso,
$maxN y $minN solo pueden ser usados dentro de la etapa $group. El campo inputuede ser un arreglo
de expresiones en cuyo caso el primer elemento se utilizará para obtener los máximos o mínimos
valores y los elementos posteriores se usarán para ser mostrados en la salida junto con el primer
elemento
» Un arreglo de largo y tipo cualquiera. En este caso, ambos operadores se pueden usar en cualquier
etapa
– n: Cantidad de resultados a obtener.
– El resultado cuando input es una expresión o arreglo de expresiones es, por cada
valor o combinación de valores en los campos especificados en el campo _id de
$group, un arreglo de arreglos de largo n conteniendo, respectivamente, los
máximos n valores de los campos especificados en input.
– El resultado cuando input es un arreglo que no cumpla con el punto anterior es un
arreglo de largo n con los máximos o mínimos n elementos en input.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $maxN en $group
• Considere la • Se le pide obtener los 3 valores máximos de score para el
gameId G1 y los playerId que obtuvieron dichos lenguajes,
siguiente colección todo en un campo llamado maxThreeScores
Sentencias MongoDB: operadores reconocidos por aggregate:
ejemplo de $minN en una etapa distinta de $group

• Considere la siguiente colección

• Se le pide obtener todos los campos de cada documento en scores, más un campo adicional llamado
minScores con los 2 valores mínimos del contenido de score. La salida de la operación se ve arriba a la derecha
Sentencias MongoDB: operadores reconocidos por
aggregate
• $median y $percentile
– Estos operadores solo pueden ser utilizados en las etapas $group
y $project
– Estos operadores admite un objeto BSON con los siguientes
campos obligatorios en común:
• input: Su valor depende de la etapa en la que el operador está siendo
utilizado
– En la etapa $group, admite un String con el nombre de un campo, anteponiéndole el
$
– En la etapa $project, admite un arreglo de largo mayor o igual que 1.
• method: Debe ser un String con ell método utilizado para calcular la media
o el cincuentavo percentil. Hasta la fecha, el único valor soportado es
“approximate”.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $median y $percentile (cont.)
– $percentile, además, requiere que el objeto BSON recibido
tenga un campo adicional llamado p, que debe ser un arreglo
numérico de largo cualquiera cuyos elementos deben ser
números comprendidos entre 0 y 1, ambos inclusive.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $median y $percentile (cont)
– El resultado de $percentile depende de la etapa en la que el operador
está siendo utilizado
• En la etapa $group, el resultado es un arreglo numérico de largo igual al de p, donde
cada elemento i-ésimo es el resultado del cálculo del percentil especificado en el
índice i-ésimo de p del valor especificado en input utilizando el méotodo de cálculo
aproximado.
• En la etapa $project, el resultado es un arreglo numérico de largo igual al de p, donde
cada elemeno i-ésimo es el resultado del cálculo del percentil especificado en el
índice i-ésimo de p entre todos los elementos numéricos del arreglo especificado en
input utilizando el método de cálculo discreto.
– El uso del operador $median equivale al uso de $percentile con p igual a
un arreglo de largo 1 conteniendo el elemento 0.5. Además, el resultado
de este operador es un simple número en vez de un arreglo.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $median en $group
• Considere la siguiente • Se le pide obtener la media de
colección todos los elementos de test01 sin
agrupar
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $percentile en $group
• Considerando la colección del ejemplo anterior, calcule el percentil del 95% de test01
sin agrupar. La salida debe contener el resultado en el campo test01_percentiles
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $median en $project
• Desde la misma colección del ejemplo anterior, por cada documento, obtener el valor de
studentId y, en un campo llamado testMeridians, la media de los valores de test01, test02 y
test03
Sentencias MongoDB: operadores reconocidos por
• $mergeObjects aggregate
– Este operador solo puede ser utilizado en las etapas $group y $replaceRoot
– Este operador admite un arreglo de objetos JSON.
– El resultado es un único objeto JSON con todos los elementos no nulos del arreglo.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $mod
– Este operador admite un arreglo numérico de largo 2. El segundo
elemento no puede ser cero.
– El resultado es el resto de la división entera entre ambos elementos
del arreglo.
• $multiply
– Este operador admite un arreglo numérico de largo mínimo 2.
– El resultado es el producto entre todos los elementos del arreglo.
• $not
– Este operador admite cualquier expresión booleana o cualquier
operador cuyo resultado es una expresión booleana.
– El resultado es true si el resultado de esa expresión es false y
viceversa.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $objectToArray
– Este operador admite un objeto BSON cualquiera
– El resultado es un arreglo de objetos de largo igual a la
cantidad de elementos en el objeto recibido.
– En el arreglo, cada elemento i-ésimo es un objeto JSON con 2
campos. Uno llamado “k” cuyo valor es la clave del campo
i-ésimo y uno llamado “v” cuyo valor es el valor asociado a esa
clave.
Sentencias MongoDB: operadores reconocidos por
aggregate. Ejemplo de $objectToArray
Sentencias MongoDB: operadores reconocidos por
aggregate
• $pow
– Este operador admite un arreglo numérico de largo 2
– Si uno de los elementos es igual a cero, el otro debe ser
distinto de cero.
– El resultado es el cálculo de la potencia del primer elemento
elevado al segundo elemento
• $rand
– Este operador permite obtener un número aleatorio
comprendido entre 0 y 1 con hasta 17 decimales.
– Este operador solo puede admitir un objeto vacío ({ $rand: { } }.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $push
– Este operador solo puede ser utilizado en la etapa $group
– Este operador admite un objeto BSON con uno o varios campos de
clave arbitraria y valor igual a una expresión en función de uno o varios
campos de la colección o etapa anterior que no sean los utilizados
para agrupar.
– El resultado, para cada valor distinto del o los campos de agrupación,
es un arreglo de objetos JSON de largo igual a la cantidad de
ocurrencias de ese o esos valores en la colección o etapa anterior.
Cada elemento en el arreglo es un objeto con las claves y valores
especificados en el objeto recibido por $push en función de los campos
especificados asociados a un grupo.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $push
• Considere una colección llamada sales con los siguientes documentos

• Usando una sola llamada a aggregate, haga lo siguiente:


– Ordene ascendentemente todos los documentos por los valores de date e item
– Agrupe el resultado del paso anterior de la manera que se indique a
continuación:
• La agrupación debe ser por el día del año, el cual debe aparecer en un campo nuevo llamado
day, y el año, que debe aparecer en un campo nuevo llamado year, ambos obtenidos de los
valores de date.
• Cada grupo debe tener todos los valores de item y quantity asociados a los valores de day y
year de ese grupo en un arreglo de objetos bajo una clave nueva llamada itemsSold.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $push
Sentencias MongoDB: operadores reconocidos por
aggregate
• $range
– Este operador admite un arreglo de largo 2 o 3:
• El primer elemento debe ser un número entero indicando el inicio de una secuencia
• El segundo debe ser un número entero indicando el fin de una secuencia.
• El tercero, si es que está presente, debe ser un número entero indicando el
incremento entre un número y el siguiente de la secuencia. Si se omite, se asume un
1
– El resultado es un arreglo numérico con todos los números de la secuencia,
incluyendo el valor del primer elemento pero excluyendo el valor del
segundo:
• Si el primer elemento es menor que el segundo y no se especificó un incremento o se
especificó un incremento positivo, los elementos del arreglo resultante serán
ordenados de menor a mayor.
• Si el primer elemento es mayor que el segundo y se especificó un incremento
negativo, los elementos del arreglo resultante serán ordenados de mayor a menor.
• En cualquier otro caso, se obtiene un arreglo vacío.
Sentencias MongoDB: operadores reconocidos por
aggregate. Ejemplo de $range
Sentencias MongoDB: operadores reconocidos por
aggregate
• $regexFind, $regexFindAll y $regexMatch
– Estos operadores admiten un objeto BSON con los siguientes
campos:
• input: Obligatorio. Debe ser un String cualquiera.
• regex: Obligatorio. Debe ser un String indicando una expresión regular
válida.
– Se puede usar el caracter slash (/) en vez de las comillas para encerrar este
String. En este caso, a menos que el siguiente campo esté presente, se puede
agregar una i y/o una m después del segundo slash. Hacer esto equivale a
agregar el siguiente campo con valor igual a “i”, “m”. “im” o “mi”.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $regexFind, $regexFindAll y $regexMatch
– Estos operadores admiten un objeto BSON con los siguientes campos
(cont.):
• options: Opcional. No debe incluirse si el valor del campo anterior es una expresión
regular encerrada entre slashes con una i y/o una m después del segundo slash.
Debe ser un String compuesto de cualquiera de los siguientes caracteres sin repetir:
– i: Ignorar mayúsculas y minúsculas
– m: Para cualquier expresión regular conteniendo al menos un substring que empiece con ^ y
termine con $, buscar coincidencias al inicio o fin de cada línea de input si input contiene
caracteres de salto de línea (\n). Si se omite, la búsqueda de coincidencias se hará al principio
o al final del valor completo de input.
– x: Ignorar todos los espacios en blanco a menos que estén “escapados” o incluidos en una
clase de caracter. Si el valor de input contiene caracteres de salto de línea, también ignorar
todos los substrings que empiecen con el caracter gato (#) y terminen con un salto de línea.
– Permite al caracter punto (.) coincidir todos los caracteres incluyendo saltos de línea
Sentencias MongoDB: operadores reconocidos por
aggregate
• $regexFind, $regexFindAll y $regexMatch
– $regexFind permite buscar en input la primera ocurrencia de
cualquier String que coincida con la expresión regular
especificada en regex, aplicando las opciones especificadas si es
que hay.
• Si no se encontraron ocurrencias, el resultado es null
• En caso contrario, el resultado es un objeto JSON con los siguientes
campos:
– match: Un String igual a la primera ocurrencia encontrada en input.
– idx: Un número entero con el índice del primer caracter de match encontrado en
input
– captures: Un arreglo de Strings con cada grupo capturado por match. Los grupos
son substrings encerrados entre paréntesis sin escapar dentro de regex.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $regexFind, $regexFindAll y $regexMatch
– $regexFindAll permite buscar en input todas las ocurrencias de
cualquier String que coincida con la expresión regular
especificada en regex, aplicando las opciones especificadas si es
que hay.
• Si no se encontraron ocurrencias, el resultado es un arreglo vacío
• En caso contrario, el resultado es un arreglo de objetos de largo igual a la
cantidad de ocurrencias encontradas, donde cada elemento es un objeto
JSON definido del mismo modo que en $regexFind
– $regexMatch permite chequear si existe al menos una ocurrencia
en input y se obtiene true si la encuentra o false en caso contrario.
Sentencias MongoDB: operadores reconocidos por aggregate.
Ejemplos de $regexFind, $regexFindAll y $regexMatch
• Considere la • Se pide obtener, por cada documento, todos los
campos de éste, más un campo adicional llamado
siguiente colección results con todas las ocurrencias de la expresión
regular “cafe”
Si se utilizara el operador
$regexFind, valor de
results para cada
documento sería null, el
único elemento del
arreglo y null.
Si se utilizara el operador
$regexMatch, el valor de
results para cada
documento sería false,
true y false.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $replaceOne y $replaceAll
– Estos operadores admiten un objeto BSON con los siguientes
campos obligatorios, todos ellos de tipo String: input, find y
replacement.
– El resultado para $replaceOne es el valor de input con la
primera ocurrencia de la expresión exacta find sustituida por
replacement.
– El resultado para $replaceAll es el valor de input con todas las
ocurrencias de la expresión exacta find sustituidas por replace.
– Para ambos operadores, si al menos uno de los 3 campos del
objeto recibido es null, en vez de eso, el resultado es null.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $reverseArray
– Este operador admite un arreglo de cualquier largo con elementos de cualquier
tipo para obtener el mismo arreglo con el orden invertido de sus elementos
Sentencias MongoDB: operadores reconocidos por
aggregate
• $slice
– Este operador admite un arreglo de largo 2 o 3
• El primer elemento, que denominamos A debe ser un arreglo de largo y tipo cualquiera
• El segundo elemento, que denominamos S debe ser un número entero. Si es cero, representa el
primer elemento de A. Si es positivo, representa un índice desde el principio de A. Si es negativo,
representa un índice desde el final de A.
• El tercer elemento, opcional, que denominamos N, debe ser un número entero positivo
– Si S es positivo o cero y es menor que el largo de A, el resultado es un arreglo con todos
los elementos de A desde el índice S hasta el final de A o hasta obtener N elementos.
– Si S es positivo o cero y es mayor o igual que el lago de A, se obtiene un arreglo vacío
– Si S es negativo, el resultado es un arreglo con todos los elementos de A desde el indice
igual al largo de A menos S hasta el principio del arreglo o hasta obtener N elementos.
– Si S es negativo y su valor absoluto es mayor que el largo de A, entonces S se vuelve
cero.
– $slice no invierte el orden del arreglo resultante cuando S es negativo.
Sentencias MongoDB: operadores reconocidos por
aggregate. Ejemplos de $slice
Sentencias MongoDB: operadores reconocidos por
aggregate
• $round
– Este operador admite un arreglo numérico de largo 1 o 2
– Si existe un segundo elemento y es positivo, el resultado es el mismo número
con hasta una cantidad de decimales (si es que tiene) igual al segundo elemento,
redondeando hacia arriba de ser necesario.
– Si existe un segundo elemento y es negativo, se remueven todos los decimales
y se reemplaza por ceros una cantidad de dígitos desde el de las unidades igual
al valor absoluto de ese elemento.
– Si no existe un segundo elemento o es cero, se remueven todos los decimales y
se aproxima la parte entera hacia arriba si el dígito para las décimas está entre 5
y 9, ambos inclusive y el dígito de las unidades es impar
– Si el primer elemento no es un número, se obtendrá un error
– El segundo elemento, si es que está presente, debe ser mayor que -20 y menor
que 100.
Sentencias MongoDB: operadores reconocidos por
aggregate. Ejemplo de Round
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setDifference
– Este operador admite un arreglo de largo 2 que debe contener solo arreglos de largo
cualquiera, que denominaremos A y B.
– El resultado es un arreglo con todos los elementos de A que no pertenecen a B.
– Si todos los elementos de B pertenecen a A, el resultado es un arreglo vacío.
– La comparación es por tipo y por valor.
– Si al menos un elemento en A y/o B es un arreglo, no se recorren sus elementos, sino que se
toma el arreglo completo para la comparación.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setEquals
– Este operador admite un arreglo de largo 2 que debe contener solo
arreglos de largo cualquiera, que denominaremos A y B.
– El resultado es true si A y B tienen los mismos elementos entre sí sin
importar el orden ni la cantidad de ocurrencias de cada elemento en A
y B.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setField y $unsetField
– $setField inserta, actualiza o elimina un campo desde un objeto.
– $setField admite un objeto BSON con los siguientes elementos
obligatorios:
• field: Debe ser una constante String con el nombre del campo que se desea
actualizar, insertar o eliminar
– Si el campo no existe, es insertado en el objeto resultante
– Si el campo existe, su valor es actualizado
• value: Debe ser el valor que tendrá el nuevo campo si es que no está o el nuevo
valor que tendrá el campo para el objeto recibido si es que está. Si se desea eliminar
el campo, el valor de este campo debe ser la palabra reservada $$REMOVE
• input: El objeto BSON con el campo a insertar, actualizar o eliminar. Para hacer
referencia al documento actual, se debe utilizar la variable $$ROOT
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setField y $unsetField(cont)
– El resultado de $setField, cuando input, field y value no son null, missing o
undefined es el objeto input con la siguiente modificación:
• Si field no existe en input, se agrega como nuevo campo al resultado con el valor especificado
en value.
• Si field existe en input y value es distinto de $$REMOVE, se actualiza field con el valor de
value
• Si field existe en input y value es $$REMOVE, se obtiene input sin ese campo.
– Para $setField, si input es null, missing o undefined, el resultado es null.
– Para $setField, si value no es una constante String, se obtendrá un error
– $unsetField recibe un objeto BSON con la misma estructura que en $setField, pero
sin el campo value.
– El uso de $unsetField dado field e input es igual a $setField para esos mismos
campos, más el campo value igual a $$REMOVE.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $setField
• Considere la siguiente colección

• Se pide obtener, para cada documento en inventory, el


documento resultante de agregar un nuevo campo llamado
[Link] con valor igual al valor de price para ese
documento. Luego, a la colección resultante, quitar el
campo price.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setIntersection
– Este operador admite un arreglo de largo mayor o igual que 2
conteniendo dos o más sub-arreglos de largo cualquiera.
– El resultado es un arreglo conteniendo cada elemento en
común que tengan todos los sub-arreglos sin repetir los
elementos en el resultado.
– Si al menos un elemento en al menos un sub-arreglo es otro
arreglo, este operador toma el elemento como un todo y no
busca elementos recursivamente.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo se $setIntersection
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setIsSubset
– Este operador admite un arreglo de largo 2 conteniendo dos o
más sub-arreglos de largo cualquiera.
– El resultado es true si el primer sub-arreglo es subconjunto del
segundo; es decir, si todos los elementos del primer sub-
arreglo existen en el segundo. En caso contrario, el resultado
es false.
– Si al menos un elemento en al menos un sub-arreglo es otro
arreglo, este operador toma el elemento como un todo y no
compara recursivamente.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo se $setIsSubset
Sentencias MongoDB: operadores reconocidos por
aggregate
• $setUnion
– Este operador admite un arreglo de largo mayor o igual a 2
conteniendo dos o más sub-arreglos de largo cualquiera.
– El resultado es un arreglo con todos los elementos entre todos
los sub-arreglos sin repetir los elementos.
– Si al menos un elemento en al menos un sub-arreglo es otro
arreglo, este operador toma el elemento como un todo y no
compara recursivamente.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo se $setUnion
Sentencias MongoDB: operadores reconocidos por
aggregate
• $size
– Este operador admite un arreglo de largo cualquiera.
– El resultado es la cantidad de elementos en el arreglo.
• $sin y $sinh
– Estos operadores admiten un número cualquiera.
– El resultado es, respectivamente, el seno y el seno hiperbólico del número recibido.
• $tan y $tanh
– Estos operadores admiten un número cualquiera de manera tal que el coseno de ese
número sea distinto de cero.
– El resultado es, respectivamente, la tangente y la tangente hiperbólica del número
recibido.
• $sqrt:
– Este operador admite un número positivo o cero.
– El resultado es la raíz cuadrada del número.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $slice
– Este operador admite un arreglo de largo entre 2 y 3 con los siguientes elementos,
dado L el largo del arreglo recibido:
• E1: Un arreglo de largo cualquiera
• E2: Si L es 2, el valor de E2 debe ser la cantidad de elementos a obtener de E1. En caso
contrario, debe ser la posición desde la cuál obtener los elementos de E1.
• E3: Debe ser la cantidad de elementos a obtener de E1.
– El resultado es un arreglo de largo menor o igual al de E1:
• Si L es 3 y E2 es positivo o cero, el primer elemento a obtener de E1 debe ser el de la posición
E2 desde el principio del arreglo, tomando 0 como el índice del primer elemento de E1.
• Si L es 3 y E2 es negativo, el primer elemento a obtener de E1 debe ser el de la posición E2
desde el final del arreglo, tomando -1 como el índice del primer elemento de E1.
• Si L es 2, el primer elemento a obtener de E1 debe ser el de la posición 0.
• Sea C=E2 si L es 2 o E3 si L es 3: Si C es positivo o cero, se debe obtener C elementos desde
el principio de E1. En caso contrario, es desde el final de E1.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $slice
– El resultado es un arreglo de largo menor o igual al de E1
(cont.):
• Si L es 3 y E2 es mayor o igual que el largo del arreglo, el resultado es
un arreglo vacío.
• Si L es 3 y E2 es negativo y su valor absoluto es menor que el largo
del arreglo, los elementos de E1 se obtienen desde el principio del
arreglo.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplos de $slice
Sentencias MongoDB: operadores reconocidos por
aggregate
• $sortArray
– Este operador admite un documento con los siguientes campos
obligatorios:
• input: Un arreglo de largo cualquiera
• sortBy: Su valor depende de si al menos un elemento en input es un documento:
– Si todos los elementos de input son elementos y se desea ordenar por uno o varios
campos específicos en los documentos, el valor de sortBy debe ser un objeto BSON con
uno o varios campos con clave igual al campo deseado, anteponiéndole el $, para el
ordenamiento y valor igual a 1 para orden ascendente o 0 para orden descendente.
– Si se desea ordenar elementos que no son documentos o si no interesa interesar por uno
o varios campos en los documentos (es decir, tomar el documento como un todo), el valor
de sortBy debe ser 1 para orden ascendente o 0 para orden descendente.
– El resultado es el arreglo en input ordenado de la forma especificada.
Sentencias MongoDB: operadores reconocidos por aggregate:
Ejemplo de $sortArray con un arreglo de documentos
Considere la siguiente colección
Sentencias MongoDB: operadores reconocidos por aggregate:
Ejemplo de $sortArray con un arreglo de documentos
Se pide ordenar todos los elementos del arreglo team descendentemente por age y, para valores iguales
de age, ascendementemente por name
Sentencias MongoDB: operadores reconocidos por aggregate:
Ejemplo de $sortArray con un arreglo que no es de documentos
Desde el ejemplo anterior, obtener un único campo llamado result cuyo valor es el arreglo [1, 4, 1, 6, 12, 5]
ordenado ascendentemente
Sentencias MongoDB: operadores reconocidos por
aggregate
• $split
– Este operador admite un arreglo de Strings de largo 2
– El resultado es un arreglo que resulta de separar todos los
elementos del primer String usando el segundo String como
expresión exacta como separador. Si la separación no es
posible, el resultado es un arreglo de largo 1 con el primer
String como elemento.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $split
Sentencias MongoDB: operadores reconocidos por
aggregate
• $stdDevPop y $stdDevSamp
– Ambos operadores solo pueden ser utilizados en cualquiera de las siguientes etapas vistas
en este documento: $addFields, $group, $match, $project, $replaceRoot, $replaceWith y $set.
– Estos dos operadores pueden admitir uno de los siguientes dos valores posibles:
• Para todas las etapas mencionadas, el nombre de un campo, anteponiéndole el $, existente en la
colección o en la etapa anterior. Si el valor del campo para un documento es un arreglo, se toma como un
valor no numérico.
• Para todas las etapas mencionadas excepto $group, un arreglo de largo cualquiera. Si uno de los
elementos del arreglo es otro arreglo, ese elemento se toma como un valor no numérico.
– El resultado es, respectivamente, la desviación estándar poblacional y la desviación estándar
muestral (el producto entre “la desviación estándar poblacional” y “la raíz cuadrada del
cuociente entre la cantidad de elementos y su antecesor entero”) sobre todos los valores
numéricos del campo o arreglo.
– Estos operadores ignoran valores no numéricos. En consecuencia, si ningún valor en el
campo o arreglo es numérico, el resultado es null.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $stdDebPop en la etapa $group
Considere la siguiente colección
Resultado
llamada users

Se pide, por cada valor de quiz, la desviación estándar


poblacional de cada valor de score para ese quiz
Sentencias MongoDB: operadores reconocidos por
aggregate
• $strcasecmp
– Este operador admite un arreglo de strings de largo 2.
– El resultado es 1 si el primer string es, en orden alfabético,
mayor que el segundo; un -1 si el segundo es mayor que el
primero o un 0 si ambos son iguales.
– Este operador no diferencia entre mayúsculas y minúsculas. Si
usted desea incluir tal distinción, utilice el operador $cmp.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $strLenBytes
– Este operador admite un string de largo cualquiera.
– El resultado es la cantidad de bytes, según la codificación de
caracteres UTF-8, que contiene el String.
• Cada caracter definido en el sistema ASCII ocupa 1 byte
• Caracteres con acentos ocupan 2 bytes.
• Caracteres extranjeros (por ejemplo, alfabeto griego o chino) y otros
caracteres pueden ocupar entre 2 y 4 bytes.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $strLenBytes
Sentencias MongoDB: operadores reconocidos por
aggregate
• $strLenCP
– Este operador admite un string de largo cualquiera.
– El resultado es la cantidad de codepoints, según la codificación
de caracteres UTF-8, que contiene el String.
– Todos los caracteres ocupan 1 codepoint cada uno.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $strLenCP
Sentencias MongoDB: operadores reconocidos por
aggregate
• $substr, $substrBytes y $substrCP
– Estos operadores admiten un arreglo de largo 3.
• El primer elemento debe ser un String de largo cualquiera
• El segundo y el tercero deben ser números enteros.
– Este operador permite obtener un sub-string desde el primer elemento de arreglo
considerando lo siguiente:
• Si el segundo elemento es positivo o cero, se considera el índice del primer byte (para $substr y
$substrBytes) o el primer carácter (para $substrCP) a extraer desde el comienzo del string. En caso
contrario, el resultado es un string vacío.
• Si el tercer elemento es positivo, se toma la cantidad de bytes (para $substr y $substrBytes) o la de
caracteres (para $substrCP) desde el índice especificado por el segundo elemento inclusive. En caso
contrario, se toman todos los caracteres desde ese índice.
– En base a lo anterior, úsese $substr o $substrBytes solo si usted tiene la certeza de que el
string desde donde extraer el substring no contendrá acentos ni caracteres no reconocidos
por ASCII.
– Desde la versión 3.4, el operador $substr se vuelve un alias para $substrBytes.
– Véase $strlenBytes para ver cuántos bytes componen un caracter.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $substr
• Considere una colección llamada inventory que contiene,
para cada documento, los siguientes campos:
– _id: La clave primaria, de tipo numérico
– item: El nombre del ítem
– quarter: El “cuatrimestre” del ítem, consistiendo de los dos últimos
dígitos del año, la letra Q y un número entre 1 y 4
– description: La descripción del producto
• Actualmente esta colección tiene los siguientes documentos
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $substr
• En base a la descripción de la diapositiva anterior, se le
pide al programador obtener, por cada documento en
inventory, un documento que contenga los siguientes
campos:
– La id del ítem
– La porción correspondiente a los años en quarter
– La porción correspondiente al cuatrimestre en quarter
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplo de $substr
Sentencias MongoDB: operadores reconocidos por
aggregate
• $subtract
– Este operador admite un arreglo de largo 2 conteniendo 2 números, 2
fechas (en un tipo de dato que constituya una fecha) o una fecha y un
número en ese orden.
– El resultado depende del tipo de dato de los elementos:
• Si ambos elementos son numéricos, el resultado es la diferencia entre ambos,
expresada en un tipo de dato numérico apropiado
• Si ambos elementos son fechas, el resultado es un NumberLong con la
diferencia, expresada en milisegundos, entre ambas fechas.
• Si el primer elemento es una fecha y el segundo es un número, el resultado
es una fecha que resulte de restarle al primer elemento la cantidad de
milisegundos especificada en el segundo elemento.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $sum
– Este operador solo puede ser utilizado en cualquiera de las siguientes
etapas: $addFields, $group, $project, $replaceRoot, $replaceWith, $set.
– Puede admitir uno de los siguientes dos valores dependiendo de la etapa:
• Para todas las etapas mencionadas, una expresión en función de uno o varios
campos en la colección o etapa anterior. En este caso, el resultado es la suma del
resultado de la expresión para todos los documentos de la colección o etapa anterior.
• Para $addFields, $project, $replaceRoot y $replaceWith y $set, un arreglo numérico
de largo 2 o superior. En este caso, el resultado es la suma entre todos los
elementos del arreglo
– Este operador ignora valores no numéricos. Si ningún valor a sumar es
numérico, el resultado es cero.
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $sum en $group
• Considere una colección llamada sales con los siguientes documentos:

• Se pide obtener, para cada par “día del año, año” obtenible desde date, “la suma del producto
entre price y quantity” en el campo totalAmount y “la cantidad de documentos” en count (sin usar
el operador $count)
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $sum en $project
• Considere una colección llamada students con los siguientes documentos:

• Se pide obtener, para cada documento en students, un documento conteniendo “la suma de
todos los elementos en quizzes” en el campo quizTotal, “la suma de todos los elementos en labs”
en el campo labsTotal y “la suma entre final y midterm” en el campo examTotal.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $switch
– Este operador admite un objeto BSON con los siguientes campos:
• branches: Obligatorio. Un arreglo de objetos de largo mayor o igual a 1 donde cada
objeto debe tener los siguientes campos obligatorios:
– case: Una expresión booleana en función de cualquier operador, campo o valor
– then: Valor a obtener en caso de que la expresión especificada en case resulte true
• default: Valor a obtener en caso de que la expresión especificada en el campo case
para todos los elementos en branches resulte false.
– Este campo es opcional. Sin embargo, si no está presente y todos los case son false, se obtendrá un
error
– El resultado es el valor correspondiente al campo then del primer elemento
de branches cuya expresión en case se evalúa a true, o el valor de default si
todos los case resultan false.
– Su uso equivale al uso de “CASE WHEN THEN ELSE END” en SQL.
Sentencias MongoDB: operadores reconocidos por
aggregate: Ejemplos de $switch
Sentencias MongoDB: operadores reconocidos por
aggregate
• $top y $topN
– Cada operador admite los mismos valores posibles que los
operadores $bottom y $bottomN respectivamente
– Estos operadores son lo inverso de $bottom y $bottomN, es
decir, permiten obtener los primeros documentos en vez de los
últimos
• $toLower y $toUpper:
– Ambos operadores admiten una expresión String.
– El resultado para cada operador es, respectivamente, el string
recibido con todas sus letras minúsculas o mayúsculas.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $tsIncrement y $tsSecond
– Cada operador admite un objeto Timestamp que puede ser nulo o un
campo inexistente de tipo Timestamp, en cuyo caso, el resultado es
null.
– El resultado para $tsIncrement cuando el objeto es distinto de null es el
valor del ordinal especificado al crear el objeto o un 1 si se creó sin el
ordinal.
– El resultado para $tsSecond cuando el objeto es distinto de null es la
cantidad de segundos, en formato UNIX, especificada al crear el objeto,
o la cantidad de segundos en ese mismo formato al momento de
crearlo si no se ha especificado tal cantidad.
– vease “Timestamp en MongoDB” para más detalles
Sentencias MongoDB: operadores reconocidos por
aggregate
• $zip
– Este operador admite un objeto BSON con los siguientes
campos:
• inputs: Un arreglo de 2 o más sub-arreglos de cualquier tipo y largo
positivo. Obligatorio. Puede ser nulo.
• useLongestLength: Booleano. Opcional. Si su valor es true, indica que se
debe usar el máximo largo entre todos los sub-arreglos en inputs para
obtener el resultado. Si se omite, se asume false, es decir, se usa el
mínimo largo entre todos ellos.
• defaults: Obligatorio si useLongestLength es true. Debe ser un arreglo de
largo igual a la cantidad de sub-arreglos en inputs con valores
cualesquiera.
Sentencias MongoDB: operadores reconocidos por
aggregate
• $zip (cont.)
– El resultado depende de los valores de los campos de entrada:
• Si inputs no es un arreglo, o al menos un elemento en inputs no es un arreglo, se
obtendrá un error.
• Si todos los sub-arreglos en inputs son del mismo largo, el resultado es un
arreglo de sub-arreglos de largo igual al largo de cada sub-arreglo en inputs, de
manera que el sub-arreglo i-ésimo de salida contenga el elemento i-ésimo de
cada sub-arreglo en inputs.
• Si existen distintos largos entre todos los sub-arreglos en inputs y
useLongestLength es falso, el sub-arreglo i-ésimo de salida contenga el
elemento i-ésimo de cada sub-arreglo en inputs hasta alcanzar el índice igual al
mínimo largo entre todos los sub-arreglos en inputs. Los elementos que no han
sido incluidos en los sub-arreglos de salida serán ignorados
Sentencias MongoDB: operadores reconocidos por
aggregate
• $zip (cont.)
– El resultado depende de los valores de los campos de entrada (cont.):
• Si existen distintos largos entre todos los sub-arreglos en inputs y useLongestLength es
true y defaults no es nulo y no es un arreglo o es de un largo distinto a la cantidad de sub-
arreglos en inputs, se obtendrá un error.
• Si existen distintos largos entre todos los sub-arreglos en inputs y useLongestLength es
true y defaults es un arreglo. El arreglo de salida será de largo igual al largo máximo entre
todos los sub-arreglos en inputs, de manera tal que:
– el sub-arreglo i-ésimo de salida contenga el elemento i-ésimo de cada sub-arreglo en inputs
– Si para el sub-arreglo j-esimo en inputs, su largo es menor que i, el elemento j del sub-arreglo i-ésimo
de salida tendrá valor igual al elemento j-esimo en defaults.
• Si existen distintos largos entre todos los sub-arreglos en inputs y useLongestLength es
true y defaults es null, se tendrá el mismo comportamiento que en el caso anterior, con la
diferencia de que elemento j del sub-arreglo i-esimo de salida tendrá valor null debido a la
ausencia de elementos en defaults.
Sentencias MongoDB: operadores reconocidos por
aggregate. Ejemplos de $zip
Sentencias MongoDB: operadores reconocidos por
aggregate
• $aggregate
– Este operador solo puede ser utilizado en las etapas $group, $bucket y $bucketAuto
– Este operador admite un objeto BSON con los siguientes campos:
• init: Obligatorio. Función que inicializa el estado de la acumulación.
• La función debe tener una cantidad de argumentos igual al largo del arreglo initArgs.
• El valor devuelto por la función debe ser un objeto JSON
• initArgs: Opcional. Un arreglo de Strings con expresiones pasadas como parámetro a la función especificada en init.
• accumulate: Obligatorio. Función que se encarga de la acumulación:
• La función debe tener una cantidad de argumentos igual al largo del arreglo accumulateArgs más 1.
• El primer argumento de la función debe contener el estado actual, conteniendo los mismos campos que el valor devuelto por la función especificada
en init.
• El valor devuelto debe ser un objeto del mismo tipo que el estado.
• accumulateArgs: Opcional. Un arreglo de Strings con expresiones pasadas como parámetro a la función especificada en
accumulate.
• merge: Obligatorio. Función encargada de fusionar dos estados.
• La función debe tener exactamente dos argumentos, cada uno representando a un estado.
• El valor devuelto debe ser del mismo tipo que los estados.
• finalize: Opcional. Función utilizada para trabajar con el estado final.
• La función debe tener exactamente un argumento que representa al estado final
• La función debe devolver un valor cualquiera
• lang: Obligatorio. Lenguaje de programación en el cuál están codificadas las funciones
• Hasta la fecha, el único valor admitido es “js” (JavaScript)
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $aggregate
• Considere la siguiente colección:

• Agrupar los resultados por el valor de city


• Utilizar el operador aggregate con los siguientes campos:
• initArgs: Debe contener 2 elementos: el campo city y una de las ciudades en la colección
• init: Debe devolver un objeto con dos campos:
• max: 3 si el primer elemento en initArgs es igual al segundo, o un 1 en caso contrario
• restaurants: Un arreglo vacío
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $aggregate
• Agrupar los resultados por el valor de city
• Mostrar, junto con cada valor de city, un campo llamado restaurants, cuyo valor es el
resultado de utilizar el operador aggregate con los siguientes campos:
• initArgs: Debe contener 2 elementos: el campo city y una de las ciudades en la colección a
elección del programador.
• init: Debe devolver un objeto con dos campos:
• max: 3 si el primer elemento en initArgs es igual al segundo, o un 1 en caso contrario
• restaurants: Un arreglo vacío
• accumulateArgs: Debe contener un único elemento, el campo name.
• accumulate: Debe actualizar el campo restaurants del estado agregando el valor de name al final
de éste pero solo si su largo es menor que el valor de max. Luego devuelve el estado resultante.
• merge: Debe devolver un objeto con dos campos:
• El campo max del primer estado
• El resultado de fusionar el campo restaurants de cada estado y luego tomar los primeros elementos hasta
llegar a la cantidad de elementos en el primer estado.
• finalize: Debe devolver el campo restaurants del estado final.
Sentencias
MongoDB:
operadores
reconocidos
por
aggregate:
ejemplo de
$aggregate:
solución
Sentencias MongoDB: operadores reconocidos por
aggregate: ejemplo de $aggregate
Sentencias de colecciones: insertOne
• Formato: db.<coleccion>.insertOne(documento)
• Este método permite insertar un documento en la colección. Si la colección
no existe, se crea automáticamente antes de insertar el documento (a
diferencia de SQL que muestra un mensaje de error).
– En consecuencia, insertOne puede equivaler a CREATE TABLE IF NOT EXISTS
coleccion...; INSERT INTO coleccion VALUES(...)
• El argumento de insertOne debe ser un objeto JSON con los campos a
insertar en la colección y sus respectivos valores.
• Si dentro de ese objeto no está presente el campo _id, MongoDB lo
agregará con un valor generado automáticamente.
• MongoDB también permite crear una colección sin insertar un documento en
ella llamando al método [Link](“nombrecoleccion”)
Sentencias de colecciones: ejemplo de insertOne

• En MongoDB, crear una colección llamada people y


agregar un registro con usuario, edad y status
Sentencias de colecciones: insertMany
• Formato: db.<coleccion>.insertMany([documento1, documento2,....])
• Este método permite insertar dos o más documentos en la colección. Si la colección no
existe, se crea automáticamente antes de insertar el documento.
– En consecuencia, insertOne puede equivaler a un CREATE TABLE IF NOT EXISTS coleccion...; y
a varios INSERT INTO coleccion VALUES(...)
• El argumento de insertOne debe ser un arreglo de objetos JSON con cada objeto
conteniendo los campos del documento a insertar en la colección y sus respectivos valores.
• Si para cada objeto en el arreglo no está presente el campo _id, MongoDB lo agregará con
un valor generado automáticamente.
• En caso de éxito, insertMany devuelve un objeto con los ids de cada documento insertado.
En caso de error, devuelve la cantidad de documentos insertados exitosamente.
• Se recomienda manejar excepciones para este método del mismo modo que en lenguaje
JAVA (try/catch)
Sentencias de colecciones: ejemplo de insertMany
Sentencias de colecciones: find y findOne
• Formatos:
– db.<coleccion>.find(query, projection, options)
– db.<coleccion>.findOne(query, projection, options)
• Estos métodos permiten obtener documentos de una colección de acuerdo a un criterio.
• El valor devuelto por findOne es un único documento.
• El valor devuelto por find se considera un cursor apuntando a una colección temporal conteniendo los
resultados de la búsqueda de acuerdo a los parámetros especificados. Más tarde se verán métodos de
cursores.
• Estos métodos admiten 3 parámetros opcionales:
– query: Un objeto BSON con 1 o más campos, de manera tal que la clave de cada campo es la clave de
un campo en la colección y su valor es el resultado de cualquier expresión booleana utilizando un
operador de consultas. Incluir este objeto equivale a una cláusula WHERE en un SELECT
– projection: Un objeto BSON con 1 o más campos, de manera tal que la clave de cada campo es la clave
de un campo en la colección y su valor es 0 o false para indicar que el campo no se incluirá en el set de
resultados, o true (o un número distinto de cero) para incluirlo. Incluir este objeto equivale a especificar
qué columnas seleccionar en la cláusula SELECT. Si se omite, equivale al uso del * en la misma
cláusula.
Sentencias de colecciones: find y findOne
• Estos métodos admiten 3 parámetros opcionales (cont.):
– options: Opcional. Un objeto BSON que admite al menos uno de los
siguientes campos con su correspondiente valor apropiado (solo se listarán
los más sencillos):
• allowsDiskUse: Booleano. Si su valor es true, permite el uso de disco para operaciones
bloqueadoras de búsqueda que excedan los 100 MB de memoria.
• bsonRegExp: Booleano. Si su valor es true, permite obtener expresiones regulares como
instancias de una clase llamada BSONRegExp
• ignoreUndefined: Booleano. Si su valor es true, no se emitirán campos indefinidos al
serializar los resultados
• limit: Entero. Determina la cantidad máxima de resultados a obtener. Si se omite, se
asume que no hay límite de resultados.
• maxTimeMS: Entero. Cantidad máxima de milisegundos a esperar antes de abortar la
consulta. Si se omite, se asume que no hay límite de tiempo.
Sentencias de colecciones: find y findOne
• Estos métodos admiten 3 parámetros opcionales (cont.):
– options: Opcional. Un objeto BSON que admite al menos uno de los
siguientes campos con su correspondiente valor apropiado (solo se listarán
los más sencillos) (cont.):
• noCursorTimeout: booleano. Si su valor es false, se asume que el espacio reservado para
el cursor con los resultados será liberado automáticamente después de 10 minutos. En
caso contrario, no se liberará el espacio. No aplica para findOne.
• promoteBuffers: booleano. Si su valor es true, todos los campos de tipo de dato binario
serán obtenidos como instancias de una clase definida en el api de [Link] llamada
Buffer
• promoteLongs: booleano. Si su valor es true, todos los campos de tipo long cuyo tamaño
sea menor a 53 bits serán obtenidos como instancias de Number
• promoteValues: booleano. Si su valor es true, cada campo será obtenidos como una
instancia de una clase de [Link] con el tipo equivalente más cercano.
Sentencias de colecciones: find y findOne
• Estos métodos admiten 3 parámetros opcionales (cont.):
– options: Opcional. Un objeto BSON que admite al menos uno de los
siguientes campos con su correspondiente valor apropiado (solo se
listarán los más sencillos) (cont.):
• retryWrites: booleano. Si su valor es true, obliga a reintentar escrituras fallidas.
• skip: entero. Ignora los primeros N registros del resultado. Útil para paginación.
• sort: Arreglo de arreglos de largo mínimo 1. Permite determinar con respecto a
qué campo(s) ordenar y en qué dirección. Cada sub-arreglo en el arreglo debe
ser de largo 2, su primer elemento debe ser el nombre de un campo en la
colección por el cuál hacer el ordenamiento y el segundo elemento debe ser un 1
para el orden ascendente, o -1 para el descendente.
• timeout: booleano. Si su valor es falso, no se liberará espacio reservado para el
cursor con los resultados por inactividad.
Sentencias de colecciones: find y findOne
• Estos métodos admiten 3 parámetros opcionales (cont.):
– options: Opcional. Un objeto BSON que admite al menos uno
de los siguientes campos con su correspondiente valor
apropiado (solo se listarán los más sencillos) (cont.):
• showRecordId: Opcional de tipo booleano. Si su valor es true, a los
campos especificados en projection (o a todos si se omite projection)
se agregará un campo $recordId con el identificador de cada registro.
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $eq, $gt, $lt, $gte, $lte, $ne
– Formato: <campo>: { <operador> : <valor> }
– Equivalen respectivamente a los operadores =, >, <, >=, <= y
<> en una cláusula WHERE en SQL
• $in, $nin
– Formato: <campo>: { <operador> : [<valor1>, <valor2>,...] }
– Equivalen respectivamente a los operadores IN y NOT IN en
una cláusula WHERE en SQL.
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $and, $or
– Formato: <campo>: { <op> : [ { <op1>: <val1> }, { <op2>, <val2> }, ... ] }
– Equivalen respectivamente a las palabras reservadas AND y OR en una cláusula
WHERE en SQL.
– Cada elemento en el arreglo está compuesto de una operación con cualquier operador
de consultas admitido por el parámetro query, incluyendo $and y $or, respetando el
formato para cada operador.
• $not
– Formato: <campo>: { $not : { <op>: <val> } }
– Equivale a la palabra reservada NOT en SQL. Es decir, filtra aquellos documentos cuyo
<campo> no cumple con la condición especificada por <op>:<val>
• $nor
– Tiene el mismo formato que $and y $or.
– Su uso equivale a: <campo>:{ $not : { $and: [ { <op1>: <val1> }, { <op2>,
<val2> }, ... ] } }
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $expr:
– Formato: $expr: { <op>: <val> }
– Permite utilizar cualquier operador reconocido por el método
aggregate con su valor apropiado para realizar el filtraje de
documentos en vez de usar el nombre de un campo en la
colección con cualquier operador admitido por query.
• $mod:
– Formato: <campo>: { $mod: [ divisor, cuociente ] }
– Equivale a <campo> MOD divisor = cuociente en SQL.
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $regex/$options:
– Formato: <campo>: { $regex: <regexp>, $options: <char> }
– Permite filtrar aquellos documentos cuyo valor para el campo
especificado concuerde con la expresión regular especificada.
– Los valores posibles de $options deben ser los mismos que
para el campo options de los operadores $regexFind,
$regexFindAll y $regexMatch dentro del método aggregate.
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $text:
– Formato: $text: { <opts> }
– Permite filtrar aquellos documentos en los que al menos un campo
contenga un String especificado.
– El valor de opts puede ser al menos una de las siguientes claves con su
respectivo valor, separados por coma:
• $search: El String a buscar entre todos los campos de todos los documentos
• $language: El lenguaje, expresado en String, en el cuál está el texto deseado, según
el estándar ISO-639-1 (inglés, español, etc.)
• $caseSensitive: booleano para indicar si se aplica distinción de mayúsculas y
minúsculas
• $diacriticSensitive: booleano para indicar si se aplica distinción por presencia o
ausencia de acentos.
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $all:
– Formato: <campo>: { $all: [ <val1>, <val2>,... ] }
– Úsese solo si <campo> es un arreglo.
– Permite filtrar por aquellos documentos en los que el arreglo especificado en <campo>
sea igual o subconjunto del valor del <campo> (sin importar el orden de los elementos en
$all o en el <campo>)
• $elemMatch:
– Formato: <campo>: {$elemMatch: { <op1>:<val1>, <op2>:<val2>.... }}
– Úsese solo si <campo> es un arreglo
– Permite filtrar por aquellos documentos en los que el arreglo especificado en <campo>
contenga al menos un elemento que cumpla con todas las condiciones especificadas por
las duplas <opN>:<valN>.
– Dependiendo del tipo de los elementos, se permite cualquier operador admitido por
query excepto $where y $text.
Sentencias de colecciones: find, findOne y distinct:
operadores de consultas admitidos por el parámetro query
• $size:
– Formato: <campo>: { $size: <numero> }
– Úsese solo si <campo> es un arreglo.
– Permite filtrar por aquellos documentos en los que el arreglo
especificado en <campo> tenga la cantidad de elementos
especificada en <numero>, sin importar el tipo de cada
elemento
Sentencias de colecciones: distinct
• Formato: db.<coleccion>.distinct(field, query, options)
• Permite obtener todos los valores distintos del campo
especificado por field para todos los documentos que
satisfagan las restricciones especificadas en query con las
opciones especificadas. El objeto options normalmente se
puede omitir o puede contener un campo con clave collation
(véase Collation)
• El objeto query admite los mismos operadores que el método
find.
• El valor devuelto es un arreglo conteniendo todos los valores
encontrados. Puede estar vacío.
Sentencias de colecciones: count, countDocuments y
estimatedDocumentCount
• Formatos:
– db.<coleccion>.count(query, options)
– db.<coleccion>.countDocuments(query, options)
– db.<coleccion>.estimatedDocumentCount(options)
• Estos métodos permiten obtener la cantidad de elementos en una colección de
acuerdo a un criterio.
• Los métodos count y countDocuments son equivalentes a la siguiente
sentencia: db.<coleccion>.find(query, { }, options).count()
• La diferencia principal entre count y countDocuments es que countDocuments
no usa metadatos para contabilizar los documentos y no admite el campo
collation.
• El método estimatedDocumentCount es equivalente a llamar a
db.<coleccion>.count({ }, options) con la única diferencia de que el parámetro
options solo admite el campo maxTimeMS
Sentencias de colecciones: deleteOne y
deleteMany
• Formatos:
– db.<coleccion>.deleteOne(query, options)
– db.<coleccion>.deleteMany(query, options)
• El método deleteOne elimina un elemento y solo uno que cumpla con las
especificaciones en query.
• El método deleteMany elimina todos los documentos que cumplan con las
especificaciones en query.
• El parámetro query, para ambos métodos, debe ser especificado del mismo modo
que en el método find.
– Este parámetro puede estar vacío para indicar que no hay restricciones y que se debe
eliminar el primer documento que encuentre (deleteOne) o todos sin excepción (deleteMany).
• Para ambos métodos, el parámetro options puede omitirse o ser un objeto que
contiene el campo collation (véase Collation)
Sentencias de colecciones: drop
• Formato: db.<coleccion>.drop()
• Elimina la <coleccion> de la base de datos.
Sentencias de colecciones: findAndModify
• Formato: db.<coleccion>.findAndModify(<options>)
• El uso de este método depende de los campos
especificados en el objeto <options> con sus valores.
• Se admiten los siguientes campos en el objeto <options>
– query: Opcional. Un objeto que debe ser definido del mismo
modo que el parámetro query en el método find y similares. Si se
omite, se asume que el objetivo es el primer elemento de la
colección
– sort: Opcional. Un objeto conteniendo cero o más campos con
nombre igual al de un campo en la colección y valor igual a 1
(orden ascendente) o -1 (orden descendente)
Sentencias de colecciones: findAndModify
• Se admiten los siguientes campos en el objeto <options> (cont.)
– remove: Obligatorio si el campo siguiente no es especificado. Booleano.
Su valor es true si se desea eliminar el registro encontrado. Si se omite,
se asume false.
– update: Obligatorio si el campo anterior no es especificado. Su valor
puede ser uno de los siguientes:
• Un objeto BSON con al menos un campo con clave igual a un operador de
actualización (se verán más adelante)
• Un objeto BSON con al menos un campo con clave igual a la clave de un campo en
la colección y valor igual al nuevo valor que tendrá ese campo en esa colección
• Un arreglo con una o más etapas reconocidas por el método aggregate considerando
que solo se admiten las siguientes etapas: $addFields, $set, $project, $unset,
$replaceWith y $replaceRoot
Sentencias de colecciones: findAndModify
• Se admiten los siguientes campos en el objeto <options> (cont.)
– new: Opcional. Booleano. Su valor debe ser true si se desea obtener el
documento modificado o false si se desea obtener el documento original.
Si se omite, se asume false.
– fields: Opcional. Su valor debe ser un objeto conteniendo al menos un
campo con clave igual a la de un campo en la colección y valor igual a 1
para incluir el campo en la salida o 0 para descartarlo. Si se omite, se
asume que se la salida tendrá todos los campos de la colección
– upsert: Opcional. Booleano. Se aplica solo si se especifica el campo
update. Su valor debe ser true para indicar que si no se encuentra un
documento con las restricciones especificadas en query, se debe insertar
uno con las claves y valores especificadas en ese campo. Si se omite, se
asume false.
Sentencias de colecciones: findAndModify
• Se admiten los siguientes campos en el objeto <options> (cont.)
– bypassDocumentValidation: Opcional. Booleano. Si su valor es true, la
actualización o eliminación de un documento se hará incluso si no se
cumplen las condiciones especificadas en el campo query. Si se omite, se
asume false.
– maxTimeMS: Opcional. Número entero positivo o cero. Indica la cantidad
máxima de milisegundos que se debe esperar para que se complete la
operación. Si se omite o si su valor es 0, se asume que no hay límite
máximo de tiempo.
– arrayFilters: Opcional. Un arreglo de objetos para determinar qué
elementos modificar en los campos que son de tipo arreglo. Más adelante
se verán los objetos posibles para cada elemento del arreglo
Sentencias de colecciones: findAndModify
• Se admiten los siguientes campos en el objeto <options>
(cont.)
– let: Opcional. Un objeto compuesto de campos de clave
definida por el programador y valor de cualquier tipo. Cada
campo definido aquí puede ser utilizado en el valor de
cualquier otro campo de <options> anteponiéndole el $$
– collation: Opcional. Véase Collation.
Sentencias de colecciones: findAndModify
• Este método puede tener el siguiente comportamiento dependiendo de los
valores de algunos campos de <options>:
• Si se encontró un documento:
– Si remove es true, el documento es removido de la colección y devuelto como objeto.
– Si remove es false:
• Si new es true, el documento encontrado es modificado y se devuelve el documento resultante.
• Si new es false, el documento encontrado es modificado y se devuelve el documento original.
• Si se encontraron 2 o más documentos, solo uno de ellos es modificado tal
como se indica arriba.
• Si no se encontró un documento:
– Si new y upsert son true, se inserta un nuevo documento con los campos
especificados en query y se devuelve el documento insertado.
– En caso contrario, se devuelve null.
Sentencias de colecciones: ejemplos de
findAndModify
EJEMPLO 1

Dada la colección cakeFlavors, encontrar el primer documento


cuyo valor de flavor sea igual a “cherry” y cambiarle el valor de
esa campo por “orange”. Utilizar el campo let en el parámetro
de findAndModify para definir una variable llamada targetFlavor
de valor “cherry” y usarla para comparar los valores de flavor.
Sentencias de colecciones: ejemplos de
EJEMPLO 2 findAndModify
Dada la colección students2, encontrar el primer
documento cuyo valor de_id sea 1 y, solo para ese
documento, modificar todos los documentos embebidos
en grades cuyo valor de grade sea mayor o igual que
85 asignándole al campo mean de esos documentos
embebidos el valor 100.
Sentencias de colecciones: ejemplos de
El resultado del ejemplo 2 es findAndModify
Aquí, se está utilizando la expresión
$[elem] para referirse a cada elemento
del arreglo grades. Luego, en el campo
arrayFilters, se hace el filtraje dentro de
grades para considerar solamente
aquellos elementos cuyo valor de grade
sea mayor o igual que 85
Sentencias de colecciones: ejemplos de
findAndModify
EJEMPLO 3
Dada la misma colección que en el ejemplo 2,
encontrar el primer documento cuyo _id sea 1
y agregarle un nuevo campo llamado total
con valor igual a la suma del valor de grade
de todos los documentos embebidos en el
arreglo grades. Devolver el documento
modificado en vez del original.
Sentencias de colecciones: findOneAndDelete
• Formato: db.<coleccion>.findOneAndDelete(filter, opts)
• Este método busca y elimina un documento de la colección, y solo uno, según las especificaciones en
filter y opts y devuelve el documento eliminado o algunos campos de él.
• El parámetro filter debe ser un objeto BSON definido del mismo modo que el parámetro query del
método find.
• El parámetro opts debe ser un objeto BSON definido del mismo modo que el parámetro options del
método find, pero solo admite los campos projection, sort, maxTimeMS, collation (véase Collation) y
otros campos más complejos.
• Llamar a este método, considerando solo projection, sort y maxTimeMS, es equivalente a:
db.<coleccion>.findAndModify({
query: filter,
sort: [Link],
fields: [Link],
remove: true,
maxTimeMS: [Link]
})
Sentencias de colecciones: findOneAndReplace y
replaceOne
• Formato:
– db.<coleccion>.findOneAndReplace(filter, repl, opts)
– db.<coleccion>.replaceOne(filter, repl, opts)
• Ambos métodos buscan un único documento de la colección (incluso si con las
restricciones en filter se obtiene más de un documento), y reemplaza el valor
actual de cada campo especificado en repl por su correspondiente valor.
• El parámetro filter debe ser un objeto BSON definido del mismo modo que el
parámetro query del método find.
• Los valores de cada campo en repl no deben contener los operadores de
actualización utilizados en el método findAndModify.
• El documento repl no debe tener el campo _id, a menos que su valor sea el
mismo del documento que se desee modificar.
Sentencias de colecciones: findOneAndReplace y
replaceOne
• Para findOneAndReplace, el parámetro opts debe ser un objeto BSON que puede
estar vacío o contener al menos una de sus siguientes claves con su respectivo
valor (solo se mencionarán los más sencillos).
– projection, sort y maxTimeMS: Los valores para estas tres claves deben estar definidos
del mismo modo que en el parámetro options de los métodos find
– upsert: Debe estar definido del mismo modo que en el parámetro options de
findAndModify
– returnDocument: Un String cuyo valor puede ser “before” para indicar que se desea
obtener el documento original o “after” en caso contrario. Si se omite, se asume “before”.
– returnNewDocument: Un booleano cuyo valor puede ser true para indicar que se desea
obtener el documento original o false en caso contrario. Incluir este campo no tiene
efecto si el campo returnDocument está presente. Si se omite, se asume false.
– collation: véase Collation
• Para replaceOne, el parámetro opts solo puede obtener los campos upsert y
collation.
Sentencias de colecciones: findOneAndReplace y
replaceOne
• El valor devuelto por findOneAndReplace depende de los valores de los campos
incluidos en opts.
– Si el documento fue encontrado, este es modificado como se indicó antes. Luego,
• Si returnDocument y returnNewDocument se omiten, se obtiene el documento original
• Si returnNewDocument está presente y returnDocument se omite:
– Si returnNewDocument es false, se obtiene el documento original. En caso contrario, se obtiene el documento
modificado.
• Si returnDocument está presente:
– Si returnDocument es “before”, se obtiene el documento original. En caso contrario, se obtiene el documento
modificado.
– Si el documento no fue encontrado:
• Si upsert es true, se inserta un nuevo documento. Luego:
– Si returnDocument y returnNewDocument se omiten, se obtiene null.
– Si returnNewDocument está presente y returnDocument se omite:
» Si returnNewDocument es false, se obtiene null. En caso contrario, se obtiene el nuevo documento
– Si returnNewDocument está presente:
» Si returnDocument es “before”, se obtiene null. En caso contrario, se obtiene el nuevo documento
• En caso contrario, se obtiene null.
Sentencias de colecciones: findOneAndReplace y
replaceOne
• El valor devuelto por replaceOne es un objeto JSON con los
siguientes campos.
– acknowledged: Campo booleano que, salvo situaciones especiales, tiene
valor true
– matchedCount: Campo numérico entero con la cantidad de documentos
encontrados que cumplan con las restricciones en filter. Puede ser cero
– modifiedCount: Campo numérico entero igual a 1 si se logró modificar un
documento existente o 0 en caso contrario
– upsertedId: Campo del mismo tipo que el campo _id de la colección. Si el
valor de upsert es false o si no hay necesidad de insertar un nuevo
documento, su valor es null. En caso contrario, su valor es el valor de _id
para el documento insertado.
Sentencias de colecciones: ejemplo de
findOneAndReplace
Dada la colección scores,
buscar el primer documento
con un score menor a 20000
y reemplazar los valores de
team y score de ese
documento por “Observant
Badgers” y 20000
respectivamente. Luego
obtener el documento original.
Sentencias de colecciones: findOneAndUpdate
• Formato: db.<coleccion>.findOneAndReplace(filter, upd, opts)
• Este método es similar a findOneAndReplace, pero tiene las
siguientes diferencias:
– A partir de la versión 4.2, el parámetro upd puede ser un arreglo de
etapas de igual manera que en el método aggregate en vez de un
documento. Solo se admiten las mismas etapas que en findAndModify
– Si el parámetro upd es un documento, se admiten operadores de
actualización en los valores de los campos que se deseen modificar.
Sentencias de colecciones: ejemplo de
findOneAndUpdate con un documento
Dada la colección grades, buscar el
primer documento con un name igual
a R. Stiles y reemplazar el valor
actual de points para ese documento
por ese mismo valor incrementado
en 5. Obtener el documento original.
Sentencias de colecciones: ejemplo de
findOneAndUpdate con un arreglo de etapas
Dada la colección students 2, buscar el documento que tenga _id igual a 1 y agregar a ese documento un
nuevo campo llamado total con valor igual a la suma de los valores de grade entre todos los documentos
embebidos en el arreglo grades. Obtener el documento modificado en vez del original.
Sentencias de colecciones: insert
• Formato:
– db.<coleccion>.insert(document)
– db.<coleccion>.insert([ doc1, doc2, ..., docN ], opts)
• Si se pasó un simple documento como parámetro, el método lo inserta en la colección. Si se
especificó el valor de _id y ya existe un documento con esa _id, se obtendrá un error.
• Si se pasó un arreglo de documentos y un objeto de opciones, el método inserta todos los
documentos del arreglo en la colección, uno por uno, hasta haberlos insertado todos o hasta
encontrar un error, dependiendo del valor de opts.
– El parámetro opts puede estar vacío u obtener un único campo booleano llamado ordered. Si se omite
ordered, se asume que su valor es true.
– Si el valor de ordered es true:
• los documentos en el arreglo son insertados en el orden especificado en el arreglo.
• Si al menos un documento a insertar viene con un campo _id con valor ya existente en la colección, se detiene la
ejecución de insert. Todos los documentos anteriores a ese son insertados de todos modos.
– En caso contrario, se inserta cada documento en orden aleatorio. Si al menos un documento a insertar
viene con un campo _id con valor ya existente en la colección, se ignora y se inserta el resto de los
documentos.
Sentencias de colecciones: insert
• Si se traspasa un simple documento como parámetro, el valor
devuelto es un objeto JSON que es instancia de la clase
WriteResult.
– Este objeto tiene, como mínimo, un campo llamado nResult con valor 1
si se insertó con éxito o un cero en caso contrario.
– Si hubo un error, este objeto también tendrá un campo llamado
writeError, cuyo valor es un objeto JSON con 2 campos:
• code: Código definido por MongoDB para el error obtenido
• errmsg: Glosa asociada al código de error obtenido.
• Si se traspasa un arreglo de documentos, el valor devuelto es
un objeto que es instancia de la clase BulkWriteResult
Sentencias de colecciones: insert
• La clase BulkWriteResult (de “bulk”, que significa bulto, para hacer
referencia a insersiones masivas) sirve para encapsular el resultado de
una inserción, actualización o eliminación masiva.
• La clase BulkWriteResult clase tiene los siguientes campos:
– acknowledged: Campo booleano para indicar si la inserción masiva
– deletedCount: Campo numérico para indicar la cantidad de documentos
eliminados
– insertedCount: Campo numérico para indicar la cantidad de documentos
insertados en una operación de inserción
– insertedIds: Contiene los valores del campo _id de cada documento insertado en
una operación de inserción. Para versiones antiguas, es un arreglo de ObjectId.
Para versiones más actuales, es un mapa que admite claves numéricas entre 0
y el largo del arreglo menos 1 y, para cada clave, un ObjectId
Sentencias de colecciones: insert
• La clase BulkWriteResult clase tiene los siguientes campos
(cont.):
– matchedCount: Campo numérico con la cantidad de documentos que
coinciden con algún criterio de actualización
– modifiedCount: Campo numérico con la cantidad de documentos
modificados
– upsertedCount: Campo numérico con la cantidad de documentos
insertados en una operación de actualización
– upsertedIds: Contiene los valores del campo _id de cada documento
insertado en una operación de actualización. Dependiendo de la versión
de MongoDB, su valor puede ser un arreglo de ObjectIds o un mapa de
claves numéricas enteras y valores ObjectId.
Sentencias de colecciones: ejemplo de insert
Sentencias de colecciones: insertOne
• Formato: db.<coleccion>.insertOne(document)
• Igual que el método insert para insertar un simple documento,
pero tiene las siguientes diferencias:
– el valor devuelto es un objeto JSON conteniendo los siguientes
campos:
• acknowledged, de tipo booleano, cuyo valor, salvo excepciones especiales, es
true
• insertedId: La id del nuevo documento. Si no se especificó un _id al insertar, este
campo será de tipo ObjectID
– En caso de error, se lanzará una excepción del tipo writeError, por lo
que se debe utilizar un try/catch (del mismo modo que en TypeScript)
para hacer la inserción
Sentencias de colecciones: ejemplo de insertOne
Sentencias de colecciones: insertMany
• Formato: db.<coleccion>.insertMany([doc1, doc2, ...], opts)
• Igual que el método insert para insertar un arreglo de documentos
con opciones, pero tiene las siguientes diferencias:
– el valor devuelto es un objeto JSON conteniendo los siguientes campos:
• acknowledged, de tipo booleano, cuyo valor, salvo excepciones especiales, es true
• insertedIds: Un arreglo de ids de los documentos insertados. El tipo de cada
elemento depende de si se especificó un _id para el correspondiente documento.
– En caso de error, se lanzará una excepción del tipo writeError, por lo que
se debe utilizar un try/catch (del mismo modo que en TypeScript) para
hacer la inserción
• El parámetro opts puede tener las mismas
opciones que en el método insert.
Sentencias de colecciones: remove
• Formato:
– db.<coleccion>.remove(query, justOne)
– db.<collection>.remove(query, opts)
• Permite remover todos los documentos que coincidan con el filtro especificado en el objeto query.
• El objeto query debe ser definido de igual manera que en find o bien ser un objeto vacío ({ }) para
indicar que se desea eliminar todos los documentos.
• El segundo parámetro puede ser un objeto con las siguientes opciones:
– justOne: booleano para indicar que solo se desea eliminar el primer documento que cumpla con el filtro
en query
– let: objeto JSON con uno o más campos con clave cualquiera definida por el programador y valor
arbitrario. Los valores de cualquiera de esos campos puede ser definido dentro del objeto query
anteponiéndole un $$ a la clave correspondiente.
– collation: véase Collation
• Si solo se desea indicar que se desea eliminar un documento sin definir variables en let, el objeto
puede ser sustituido por un booleano (véase formato 1).
Sentencias de colecciones: ejemplo de remove
Dada la colección
cakeFlavors, remover
todos los documentos
cuyo valor de flavor sea
“strawberry”.
Parametrizar ese valor
creando una variable
llamada targetFlavor.
Sentencias de colecciones: renameCollection
• Formato: db.<coleccion>.renameCollection(newName,
dropExisting)
• Permite cambiarle el nombre a la <colección> por el especificado
en newName.
• El parámetro dropExisting es un booleano opcional para indicar
que, si una colección con el nombre especificado por newName
ya existe en la base de datos, ésta será eliminada antes de
cambiar el nombre a la <coleccion>. Si se omite, se asume false.
• El método generará un error si la colección newName existe y
dropExisting es false.
Sentencias de colecciones: totalSize
• Formato: db.<coleccion>.totalSize()
• Permite obtener el tamaño, en bytes, de todos los
documentos y todos los índices existentes en la colección.
Sentencias de colecciones: update
• Formato: db.<coleccion>.update(query, update, options)
• Permite actualizar uno o todos los documentos que cumplan con el filtro especificado en query. Luego
devuelve un objeto WriteResult con el resultado de la operación
• El parámetro query debe ser definido del mismo modo que en el método find
• El parámetro update debe ser definido del mismo modo que el campo update del parámetro options
del método findAndModify
• El parámetro options debe ser un objeto BSON que puede estar vacío o contener las siguientes claves
con su valor correcto:
– multi: Booleano. Si su valor es false o si se omite, se actualiza solo el primer documento encontrado. Si su
valor es true, se actualizan todos.
– upsert: Booleano. Si su valor es true y no se encontró un documento, se insertará uno con los nuevos valores
para cada campo especificado en query. Si se omite, se asume false.
– arrayFilters. Un objeto BSON que debe ser definido de igual forma que el campo del mismo nombre en el
parámetro options de findAndModify
– let: Un objeto BSON que debe ser definido del mismo modo que el campo del mismo nombre del parámetro
opts del método remove.
– collation: véase Collation
Sentencias de colecciones: update
• El objeto WriteResult obtenido es un objeto JSON que contiene
las siguientes claves:
– nMatched: Cantidad de documentos que coinciden con el criterio
respecificado en query. Puede ser cero.
– nUpserted: Un 1 si se insertó un documento nuevo o un 0 en caso
contrario.
– nModified: Cantidad de documentos modificados. Puede ser cero.
– writeConcernError: Un objeto JSON que normalmente no se muestra.
– writeError: Un objeto JSON que solo aparece en caso de un error.
Contiene las siguientes claves:
• code: Código del error
• errmsg: Glosa asociada al código del error.
Sentencias de colecciones: updateOne y updateMany

• Formato:
– db.<coleccion>.updateOne(query, update, options)
– db.<coleccion>.updateMany(query, update, options)
• Cada método es equivalente a llamar al método update
con el campo multi del parámetro options igual a false y a
true, respectivamente.
• A diferencia de update, en estos métodos no se permite
el campo let en el parámetro options.
Sentencias de colecciones: validate
• Formato: db.<coleccion>.validate(options)
• Permite validar la colección según lo especificado en options.
• El objeto options puede estar vacío o contener al menos uno de
los siguientes campos:
– full: Booleano. Si su valor es true, se hará una validación más lenta,
pero más completa. Si se omite, se asume false.
– repair: Booleano. Si su valor es true, cualquier documento que no pase
la validación será reparado. Si se omite, se asume false.
– checkBSONConformance: Booleano. Si su valor es true, se valida
conformancia con la notación BSON. Si se omite, se asume el valor del
campo full.
Sentencias de colecciones: bulkWrite
• Formato: db.<coleccion>.bulkWrite(operations, options)
• Genera inserciones, actualizaciones y eliminaciones masivas
sucesivas
• El parámetro operations es obligatorio y debe ser un arreglo de
objetos en el que cada objeto debe tener una única clave que
debe ser una y solo una de las siguientes: insertOne,
replaceOne, updateOne, updateMany, deleteOne y deleteMany.
• El valor para la clave designada debe ser un objeto BSON cuyo
contenido depende de la clave.
Sentencias de colecciones: bulkWrite
• El arreglo debe tener largo mínimo de 1 elemento y cada
elemento en el arreglo puede tener claves repetidas (por ejemplo,
2 o más insertOne)
• El parámetro options es opcional y puede contener un único
campo con clave ordered y valor booleano. El campo ordered
sirve para determinar si cada operación en el arreglo debe ser
ejecutada en orden, lo cual se hará si ordered es true o si se
omite.
• Es obligatorio colocar una llamada a bulkWrite en un try/catch
debido a que puede lanzar una excepción al intentar ejecutar una
de las operaciones.
Sentencias de colecciones: bulkWrite
• Para cada elemento en operations, además de la clave
representando la operación, su valor debe ser un objeto
BSON conteniendo algunos campos dependiendo de esa
clave
• Para la operación insertOne, solo se permite un único campo
con clave document y valor igual al documento que se desee
insertar en la colección.
– filter: Aplicable si la clave del objeto no es insertOne. Equivale al
parámetro query en updateOne, updateMany, deleteOne y
deleteMany
Sentencias de colecciones: bulkWrite
• Para las demás operaciones, dependiendo de la operación, se permiten
algunos de los siguientes campos:
– filter: Equivale al parámetro query o filter en los métodos updateOne,
updateMany, replaceOne, deleteOne y deleteMany. Aplicable para todas las
operaciones con el mismo nombre
– update: Equivale al parámetro update en updateOne y updateMany. Aplicable
para ambas operaciones con el mismo nombre.
– upsert: Equivale al campo upsert en el parámetro options de updateOne.
updateMany y replaceOne. Aplicable para todas las operaciones con el mismo
nombre
– arrayFilters: Equivale al campo arrayFilters en el parámetro options de
updateOne y updateMany. Aplicable a ambas operaciones con el misno nombre
Sentencias de colecciones: bulkWrite
• Para las demás operaciones, dependiendo de la operación, se
permiten algunos de los siguientes campos (cont.):
– replacement: Aplicable solamente a la operación replaceOne. Equivale
al parámetro replacement en el método del mismo nombre.
• El método bulkWrite devuelve un objeto BulkWriteResult
conteniendo las cantidades de documentos insertados por
insertOne, insertados por operaciones distintas de insertOne,
actualizados, eliminados y encontrados, ademas de las _id de
los documentos insertados y errores detectados, si es que hubo.
Sentencias de colecciones: ejemplo de bulkWrite

Este ejemplo crea una colección pizzas (si no se ha creado antes), inserta dos documentos de _id 3 y 4,
luego actualiza el primer documento que tenga el valor de type igual a “cheese” asignándole un precio igual
a 5, luego elimina el primer documento cuyo type sea “peperoni” y finalmente reemplaza el primer
documento cuyo type sea “vegan” por uno con tipo “tofu”, size “small” y price 4. Se especificó aquí que todas
las operaciones deben ser ejecutadas en orden.
Sentencias de colecciones: filtros de arreglos
• Para todos los métodos cuyo parámetro options admita un campo arrayFilters y un
campo update, su valor debe ser un objeto BSON indicando operaciones de
actualización para cada elemento de un campo de tipo arreglo.
• Para que esto funcione:
– el valor del parámetro update debe ser un arreglo de etapas de manera tal que al menos
una etapa debe ser $addFields, $set, $project o $unset
– Sea <c> el campo del tipo arreglo de objetos en la colección, <e> un nombre arbitrario
para referenciar a cada elemento en <c>. El valor para cualquiera de las etapas de arriba
debe contener al menos un campo con clave igual a “<c>.$[<e>]”
– Al menos un elemento en el arreglo arrayFilters en options debe contener una clave igual
a <e>
– Si <c> es un arreglo de objetos, se puede acceder a un campo <f> de <e> usando el
caracter punto. Ejemplo: “<c>.$[<e>].<f>”
• Para un ejemplo, véase el ejemplo 2 del método findAndModify
Sentencias de colecciones: operadores de actualización

• Para todos los métodos que admitan un parámetro


update con valor igual a un objeto BSON en vez de un
arreglo de etapas, el valor de cada campo que se desee
modificar puede ser un valor fijo o el resultado de un
operador de actualización.
Sentencias de colecciones: operadores de actualización

• Para todos los métodos que admitan un parámetro update


con valor igual a un objeto BSON en vez de un arreglo de
etapas, las claves de cada campo en el parámetro deben ser
operadores de actualización reconocidos por MongoDB y
todos deben empezar con el caracter $.
• MongoDB reconoce los siguientes tipos de operadores de
actualización:
– Operadores de campos
– Operadores de arreglos
– Operadores a nivel de bit
Sentencias de colecciones: operadores de actualización
de campos: $currentDate
• Formato: $currentDate: { <campo>: <spec> }
• Asigna a <campo> la fecha actual según las especificaciones en
<spec>
• <spec> puede tener uno de los siguientes valores posibles:
– Un booleano. Su valor debe ser true para indicar que la fecha actual será
asignada como un date.
– Un objeto BSON conteniendo un único campo llamado $type, con valor igual a
“date” o “timestamp”.
• Si el <campo> no existe, se agrega a la colección.
• Si el <campo> corresponde al campo de un documento embebido
(<campo>.<emb>), además de crear el <campo> en la colección,
también crea el campo <emb> en el <campo>
Sentencias de colecciones: operadores de actualización
de campos: Ejemplo de $currentDate
Dada esta colección

• Utilizar los operadores $currentDate y $set para hacer lo


siguiente con el documento que tenga _id igual a 1:
• agregar un campo llamado cancellation, cuyo valor debe ser
un documento embebido conteniendo los siguientes campos:
• date: fecha de cancelación en formato timestamp con
valor igual a la fecha actual
• reason: Motivo de la cancelación
• Asignar al campo lastModified la fecha actual en formato
Date.

El resultado es
Sentencias de colecciones: operadores de actualización
de campos: Ejemplo de $currentDate
¿Cómo sería el ejemplo anterior si se quisiera utilizar un arreglo de etapas?

Las expresiones $$NOW y $$CLUSTER_TIME son utilizados en etapas para hacer referencia a la fecha
actual en formato Date y Timestamp, respectivamente.
Sentencias de colecciones: operadores de actualización
de campos: $inc
• Formato: $inc: { <campo1>: <num1>, <campo2>:
<num2>, ... }
• Para cada <campoN> numérico, incrementa o disminuye
su valor actual en el correspondiente valor de <numN>.
• Para disminuir el valor de un campo, simplemente usar
un valor negativo.
• Si un <campoN> no existe, se crea automáticamente en
la colección y se le asigna valor <valorN>.
Sentencias de colecciones: operadores de actualización
de campos: ejemplo de $inc
Dada esta colección Actualizar el documento que tenga el valor de sku
igual a “abc123” disminuyendo el valor de quantity
en 2 e incrementando el del campo orders en el
documento embebido metrics en 1

Resultado
Solución
Sentencias de colecciones: operadores de actualización
de campos: $min
• Formato: $min: { <campo1>: <num1>, <campo2>: <num2>, ... }
• Para cada <campoN>, si el valor de <numN> es menor que el
valor actual del <campoN>, se le asigna a <campoN> el valor de
<numN>.
• Si <campoN> no existe, se crea asignándole el valor de <numN>

En este ejemplo, se utiliza el


operador $min en el método
updateOne para asignar al campo
lowScore el valor de 150 solo si
actualmente ese campo tiene un
valor mayor, lo cual ocurre en este
caso.
Sentencias de colecciones: operadores de actualización
de campos: $max
• Formato: $max: { <campo1>: <num1>, <campo2>:
<num2>, ... }
• Para cada <campoN>, si el valor de <numN> es mayor
que el valor actual del <campoN>, se le asigna a
<campoN> el valor de <numN>.
• Si <campoN> no existe, se crea asignándole el valor de
<numN>
Sentencias de colecciones: operadores de actualización
de campos: $mul
• Formato: $mul: { <campo1>: <num1>, <campo2>: <num2>, ... }
• Para cada <campoN>, se le asigna un valor igual al producto
entre su valor actual y el valor de <numN>.
• Si <campoN> no existe, se crea asignándole un cero

En este ejemplo, se le asigna al campo price el producto entre su


valor actual y 1.23 y al mismo tiempo duplica el valor actual de
quantity, logrando el resultado de abajo
Sentencias de colecciones: operadores de actualización
de campos: $rename
• Formato: $rename: { <campo1>: <nom1>, <campo2>:
<nom2>, ... }
• Para cada <campoN>, se le cambia su nombre actual por
el nombre especificado por nomN.
• Si para un <campoN> ya existe un campo llamado
<nomN>, este es removido antes de cambiar el nombre a
<campoN>
• Si un <campoN> no existe, no se hará ninguna acción
para ese campo.
Sentencias de colecciones: operadores de actualización
de campos: Ejemplos de $set y $setOnInsert
• Considere una colección sin documentos llamada products.
Actualizar el documento con _id 1 de la colección
asignándole el valor “apple” al campo item. Si no existe un
documento con esa _id, insertarlo agregando un campo
adicional llamado defaultQty con valor 100.

Resultado
Sentencias de colecciones: operadores de actualización
de campos: $unset
• Formato: $unset: { <campo1>: <val1>, <campo2>:
<val2>, ... }
• Remueve cada <campoN> especificado de la colección.
• Los <valN> especificados no tienen relevancia y solo se
exigen para conformidad con la sintaxis y semántica
especificadas por JSON.
Sentencias de colecciones: operadores de actualización
de arreglos
• Se tienen las siguientes consideraciones generales:
– Si el operador es para modificar el valor de un elemento de un
campo de tipo arreglo y ese campo no existe en la colección,
ese campo es agregado a la colección asignándole un arreglo
vacío y dejando al nuevo valor como el primer elemento del
arreglo
– Si el campo objetivo del operador no es un arreglo, se obtendrá
un error.
Sentencias de colecciones: operadores de actualización
de arreglos: $
• Formato: <operador>: { <arreglo>.$: <valor> }
• Permite especificar que un nuevo valor será asignado al
primer elemento del arreglo especificado que cumpla con
el filtro especificado en un método update dentro del
objeto query.
• Si el arreglo contiene documentos embebidos, el formato
para acceder a un campo del primer documento
encontrado es
<operador>: { <arreglo>.$.<campo>: <valor> }
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplo de $

Considere la siguiente colección

Para el documento con _id 1 en students,


actualizar el primer elemento del arreglo grades
cuyo valor sea 80, asignándole el valor 82

El resultado es
Sentencias de colecciones: operadores de actualización
de arreglos: $[ ]
• Formato: <operador>: { <arreglo>.$[ ]: <valor> }
• Permite especificar que un nuevo valor será asignado a
todos los elementos del arreglo especificado para cada
documento que cumpla con el filtro especificado en un
método update dentro del objeto query.
• Si el arreglo contiene documentos embebidos, el formato
para acceder a un campo del primer documento
encontrado es
<operador>: { <arreglo>.$[ ].<campo>: <valor> }
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplo de $

Considere la colección del ejemplo anterior (sin las


modificaciones al arreglo grades del documento con _id 1)
Incremente en 10 todos los elementos de grades
para todos los documentos de la colección

El resultado es
Sentencias de colecciones: operadores de actualización
de arreglos: $[el]
• Formato:
<operador>: { <arreglo>.$[<el>]: <valorNuevo> },
arrayFilters: {<el>: <valorActual>}
• Sirve para definir un campo llamado <el> que será
utilizado dentro de un objeto utilizado como valor para el
campo arrayFilters en los métodos update y
findAndModify.
• Refiérase al método findAndModify para un ejemplo
Sentencias de colecciones: operadores de actualización
de arreglos: $addToSet
• Formato: $addToSet: { <arreglo1>: <valor1>, <arreglo2>:
<valor2>... }
• Para cada <arregloN>, agrega un elemento con <valorN> al
final de ese <arregloN> si no existe en ese arreglo.
• Si el <valorN> a agregar es un arreglo, se toma el arreglo
completo como un simple elemento.
• Si se desea agregar más de un elemento al <arregloN>, el
<valorN> debe ser un objeto BSON con la clave $each (que se
verá más adelante) y valor igual a un arreglo de largo
cualquiera conteniendo los elementos que se deseen agregar.
Sentencias de colecciones: operadores de actualización
de arreglos: ejemplo de $addToSet

Considere la siguiente colección

Agregue al final del arreglo letters del


documento con _id 1 un arreglo con los
elementos “c” y “d”.

El resultado es
Sentencias de colecciones: operadores de actualización
de arreglos: $pop
• Formato: $pop: { <arreglo1>: -1|1, <arreglo2>: -1|1... }
• Para cada <arregloN>, elimina el primer elemento (si se le asignó valor
-1) o el último (si se le asignó valor 1) del <arregloN>.
El ejemplo elimina el
primer elemento del
arreglo scores del
documento con _id 1
Sentencias de colecciones: operadores de actualización
de arreglos: $pull
• Formato: $pull: { <arreglo1>: <x1>, <arreglo2>: <x2>... }
• Para cada <arregloN>, $pull remueve todos los
elementos que tengan un valor específico o que cumplan
con una condición específica.
• En consecuencia, cada <xN> puede ser:
– Un valor específico
– Cualquier operación de filtraje admitida por find y update en
función de uno o varios elementos del arreglo.
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplos de $pull
EJEMPLO 1
Dada la colección stores, para
todos los documentos en la
colección, remover las palabras
“apples” y “oranges” del arreglo
fruits y remover la palabra “carrots”
del arreglo vegetables

Solución

Resultado
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplos de $pull
EJEMPLO 2
Dada la colección profiles, remover del arreglo votes del documento con _id 1 todos los elementos que sean
mayores o iguales a 6

Solución

Resultado
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplos de $pull
EJEMPLO 3
Hacer las siguientes operaciones en
la colección profilesBulkWrite con
una única sentencia:
• Insertar un documento con _id 1 y
un campo votes igual a un arreglo
conteniendo números enteros
entre el 3 y el 8, ambos inclusive
• Actualizar el documento insertado
removiendo todos los elementos
de votes mayores o iguales a 6
• Actualizar el documento insertado
removiendo todos los elementos
de votes menores o iguales a 3
El resultado se muestra abajo
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplos de $pull
EJEMPLO 4
Dada la colección survey a la derecha, para todos los documentos
en ella remover todos los elementos del arreglo results que tengan
un item “B” y score 8

Como resultado de la sentencia de arriba, el arreglo results


del documento con _id 1 tendrá solo un elemento mientras
que el del documento con _id 2 se mantendrá sin cambios
Sentencias de colecciones: operadores de actualización
de arreglos: $push
• Formato: $push: { <arreglo1>: <x1>, <arreglo2>: <x2>... }
• Para cada <arregloN>, $push se comporta de manera
similar a $addToSet con las siguientes diferencias:
– $push permite elementos repetidos en los arreglos.
– El valor de <xN> puede ser un valor simple de cualquier tipo o
un objeto conteniendo uno o más campos con una clave igual a
un operador de inserción de arreglos reconocido por MongoDB
y un valor que depende de cada clave.
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplo de $push sin operadores
Dada la colección de la derecha, agregar al
arreglo scores del documento con _id 1 el
número 89
Sentencias de colecciones: operadores de actualización
de arreglos: operadores de $push: $each
• Formato:
– $push: { <arreglo1>: { $each: [ v1, v2,...] }, ... }
– $addToSet: { <arreglo1>: { $each: [ v1, v2,...] }, ... }
• Permite utilizar $push y $addToSet para agregar dos
o más elementos al final de un arreglo
• Para el caso de $addToSet, solo se agregarán los
elementos que actualmente no existen en el arreglo,
mientras que para el caso de $push, se agregarán
todos los elementos sin excepción.
Sentencias de colecciones: operadores de actualización
de arreglos: Ejemplos de $each
El ejemplo de la derecha agrega los elementos 90,
92 y 95 al arreglo scores del documento que tenga
el valor de name igual a “joe” en la colección
students

Este ejemplo agrega


al arreglo tags del
documento con _id 2
en inventory los
elementos “camera”,
“electronics” y
“accessories” pero
solo si no existen
actualmente en tags.
Sentencias de colecciones: operadores de actualización
de arreglos: operadores de $push: $slice
• Formato:
– $push: { <arreglo1>: { $each: [ v1, v2,...], $slice: N }, ... }
– $addToSet: { <arreglo1>: { $each: [ v1, v2,...], $slice: N }, ... }
• Permite limitar el tamaño máximo que debe tener el <arregloN> después de
agregarle elementos nuevos con $each.
• Es posible utilizar el operador $slice sin agregar un nuevo elemento
asignándole a $each un arreglo vacío.
• El valor de $slice puede ser:
– Un número positivo para indicar que el arreglo debe contener solamente los
primeros N elementos después de agregarle elementos
– Un número negativo para indicar que el arreglo debe contener solamente los
últimos N elementos después de agregarle elementos
– Un cero para vaciar el arreglo.
Sentencias de colecciones: operadores de actualización
de arreglos: ejemplo de $slice
Dada la colección scores conteniendo este documento

Agregar al arreglo scores de ese documento los


elementos 80, 78 y 86 y luego descartar todos los
elementos de ese arreglo excepto los últimos 5.

El resultado es
Sentencias de colecciones: operadores de actualización
de arreglos: operadores de $push: $sort
• Formato: $push: { <arreglo1>: { $each: [ v1, v2,...], $sort:
N }, ... }
• Permite ordenar todos los elementos del <arregloN>
después de agregarle elementos nuevos con $each.
• Es posible utilizar el operador $sort sin agregar un
nuevo elemento asignándole a $each un arreglo vacío.
• El valor de $sort puede ser un 1 para indicar orden
ascendente o un -1 para el orden descendente.
Sentencias de colecciones: operadores de actualización
de arreglos: operadores de $push: $position
• Formato: $push: { <arreglo1>: { $each: [ v1, v2,...], $position: N }, ... }
• Permite insertar los elementos especificados por
$each en una posición específica de <arregloN>.
Sentencias de colecciones: operadores de actualización
de arreglos: operadores de $push: $position
• El valor de $position puede ser:
– Un número positivo menor que el largo del arreglo para indicar que los
elementos se insertarán posteriormente al elemento N-ésimo del arreglo
contando desde el principio del arreglo.
– Un número negativo con valor absoluto menor que el largo del arreglo
para indicar que los elementos se insertarán posteriormente al elemento
N-esimo del arreglo contando desde el final del arreglo.
– Un número positivo mayor que el largo del arreglo para indicar que los
elementos se insertarán al final del arreglo (comportamiento por defecto)
– Un cero o un número negativo con valor absoluto mayor que el largo del
arreglo para indicar que los elementos se insertarán al principio del
arreglo.
Sentencias de colecciones: operadores de actualización
de arreglos: $push
• Se tiene las siguientes consideraciones con los operadores
de $push:
– Si se desean utilizar, obligatoriamente debe estar presente el
operador $each
– Además de $each, se puede agregar cualquier combinación de
$slice, $sort y $position en cualquier orden.
– El orden de precedencia de cada operador es como sigue:
• $position (si se omite $position, se asume el final del arreglo)
• $each
• $sort
• $slice
Sentencias de colecciones: operadores de actualización
de arreglos: $pullAll
• Formato: $pullAll: { <arreglo1>: <v1>, <arreglo2>:
<v2>,... }
• Para cada <arregloN>, $pullAll remueve elementos de
ese arreglo de manera tal que el arreglo resultante
contenga todos los elementos de <arregloN> que no
pertenecen a <vN>.
• Esto, en términos de teoria de conjuntos es equivalente a
una diferencia entre <arregloN> y <vN>.
Sentencias de colecciones: operadores de actualización
de arreglos: ejemplo de $pullAll
Sentencias de colecciones: el operador $bit
• Formato: $bit: {<campo>: { <op>: <num> } }
• Este operador es utilizado para operaciones a nivel de bit entre el valor
de <campo> y el número especificado <num>.
• Para este operador, <op> puede ser and (Y), or (O) o xor (O exclusivo)
• Las operaciones a nivel de bit consisten en:
– Convertir ambos operandos a su representación binaria, rellenando con
ceros a la izquierda de ser necesario para que ambos números binarios
tengan igual cantidad de dígitos.
– Se hace la operación a nivel de bit entre el primer dígito del primer número y
el primero del segundo dígito, luego el segundo dígito y así sucesivamente.
– El resultado es convertido de vuelta a notación decimal.
Sentencias de colecciones: el operador $bit
Operador A B Resultado
• El resultado de la operación 1 1 1
depende del operador utilizado: 1 0 0
and
0 1 0
El ejemplo aquí
actualiza el 0 0 0
documento con _id 1 1 1
1 de la colección 1 0 1
switches asignando or
al campo expdata 0 1 1
una operación AND 0 0 0
a nivel de bit entre 1 1 0
su valor actual y 10
1 0 1
xor
0 1 1
0 0 0
Sentencias de colecciones: explain
• Formato: db.<coleccion>.explain(verb).<metodo>.(<args>)
• Este método permite indicar al servidor que muestre un plan de consulta
para el <metodo> especificado con sus argumentos (<args>)
• Se puede obtener un plan de consulta para los métodos aggregate, count,
find, remove, distinct, findAndModify y reduce (a partir de la versión 4.4).
• Si el <metodo> consultado es find, explain permite llamar a métodos desde
el cursor u objeto para incluirlo en el plan (Por ejemplo:
db.<coleccion>.find(...).sort(...).hint(...))
• Para saber qué métodos se pueden llamar desde el valor devuelto por find que sean
incluidos por explain, lea la salida de db.<coleccion>.explain(...).find(...).help()
• También se puede llamar a db.<coleccion>.explain(verb).help() para obtener
ayuda del uso de explain
Sentencias de colecciones: explain
• El parámetro verb es opcional y sirve para indicar qué mostrar en la
salida. Puede ser uno de los siguientes:
• “queryPlanner”: escoger el plan más óptimo, conocido como “winning plane” y
mostrar la información del plan.
• Se asume este valor por defecto
• “executionStats”: Igual al anterior, pero ejecutando el plan escogido antes de
mostrarlo.
• Si el método explicado modifica o elimina documentos, esos cambios son
automáticamente descartados.
• “allPlansExecution”: Igual al anterior, pero mostrando también todos los demás
planes candidatos.
• true: igual a “allPlansExecution”
• false: igual a “queryPlanner”
Sentencias de colecciones: explain
• La salida de explain es un objeto BSON con al menos los siguientes
campos:
• explainVersion: Número con la versión del método
• command: Detalles del método siendo explicado.
• queryPlanner: Un objeto con el detalle del plan seleccionado.
• executionStats: Presente solo si el parámetro verb es distinto de “queryPlanner”.
• Si el valor de verb es “executionStats”, se muestra el detalle de la ejecución del plan
• Si el valor de verb es “allPlansExecution”, se muestra también el detalle de los planes que
no fueron seleccionados.
• serverInfo: Detalle de la información del servidor
• serverParameters: detalle de los parámetros internos presentes en el servidor al
momento de llamar a explain.
Sentencias de colecciones: sentencias con
índices
• Formato:
• db.<coleccion>.createIndex(keys, opts, quorum)
• db.<coleccion>.createIndexes([pattern_keys], opts, quorum)
• db.<coleccion>.dropIndex(index)
• db.<coleccion>.dropIndexes(?)
• db.<coleccion>.getIndexes()
• db.<coleccion>.hideIndex(index)
• db.<coleccion>.totalIndexSize()
• db.<coleccion>.unhideIndex(index)
• Véase Índices para una explicación detallada de cada método
Métodos de cursores
• Tal como se mencionó anteriormente, el valor devuelto
por el método find devuelve un cursor.
• Los cursores, en MongoDB, son objetos conteniendo sus
propios métodos para manipularlos de ser necesario.
• Algunos de estos métodos están deprecados a partir de
una versión específica.
• Los métodos de cursores solo pueden ser invocados
dentro de una función javascript traspasada como
parámetro a un método que lo requiera.
Métodos de cursores: addOption
• Formato: db.<coleccion>.find(...).addOption(opcion)
• Permite agregar opciones al cursor.
• El valor devuelto es el cursor con la opción especificada
habilitada, permitiendo agregar más opciones “en cadena”
o llamar a otros métodos al cursor resultante.
• Cada opción reconocida es un atributo público de la clase
[Link], definida en NodeJS.
Métodos de cursores: addOption
• Este método es marcado como deprecado desde la
versión 3.2. Reemplácelo por alguno de los siguientes
métodos que hacen lo mismo dependiendo del atributo
de [Link] especificado:
– tailable y awaitData:
db.<coleccion>.find(...).tailable({ awaitData: bool })
– noTimeout: db.<coleccion>.find(...).noCursorTimeout()
Métodos de cursores: addOption
• Los siguientes atributos de [Link] son opciones
reconocidas por el método addOption:
– tailable: No cerrar el cursor una vez que el último dato es recibido
– noTimeout: Evita que el cursor cierre automáticamente por inactividad.
– awaitData: Úsese con el cursor resultante de la llamada a
addOption([Link]) para bloquear la hebra de
consulta cuando no hay datos disponibles y esperar por más datos por
un tiempo limitado. Si el tiempo expira, no se obtienen más datos.
– exhaust: Fuerza a devolver todos los documentos al mismo tiempo en
vez de dividirlo en batches.
Métodos de cursores: allowDiskUse
• Formato: db.<coleccion>.find(...).allowDiskUse(flag)
• Permite o prohibe, dependiendo del valor del parámetro
booleano flag, crear archivos temporales en disco cuando se
utilizan etapas y una de ellas excede los 100MB de límite de
memoria.
• A partir de la versión 6, si se omite flag, se asume el valor true.
• Antes de la versión 6, si se omite flag, se asume el valor de un
parámetro general de mongod (Mongo Daemon) llamado
allowDiskUseByDefault
Métodos de cursores: batchSize
• Formato: db.<coleccion>.find(...).batchSize(n)
• Divide el resultado del método find en n batches.
• En muchos casos, esto no afecta la aplicación ni al
usuario, puesto que muchos controladores devuelven el
resultado como si estuviera en un único batch.
Métodos de cursores: batchSize y close
• Para batchSize:
– Formato: db.<coleccion>.find(...).batchSize(n)
– Divide el resultado del método find en n batches.
– En muchos casos, esto no afecta la aplicación ni al usuario,
puesto que muchos controladores devuelven el resultado como
si estuviera en un único batch.
• Para close:
– Formato: db.<coleccion>.find(...).close( )
– Cierra el cursor.
Métodos de cursores: isClosed
• Formato: db.<coleccion>.find(...).isClosed( )
• Devuelve true si el cursor está cerrado o false en caso
contrario.
• Un cursor cerrado aun puede tener documentos que
faltan por leer en el último batch recibido.
Métodos de cursores: count
• Formato: db.<coleccion>.find(...).count( )
• Devuelve la cantidad de documentos resultantes de la
llamada a find.
• Llamar al método count de un cursor de una <colección>,
dados los parámetros query y options de find, es
equivalente a llamar a db.<coleccion>.count(query,
options)
Métodos de cursores: forEach
• Formato:
db.<coleccion>.find(...).forEach(function(doc){/*...*/ } )
• Ejecuta la función especificada por cada documento en el
cursor, representado por el parámetro doc.
• El ejemplo de abajo imprime en consola la expresión “user:
“ seguida del valor del campo name de cada documento para
todos los documentos de la colección users.
Métodos de cursores: hasNext y hasExhausted

• Para hasNext
– Formato: db.<coleccion>.find(...).hasNext( )
– Devuelve true si aun quedan más documentos que leer del
cursor incluso si está cerrado.
• Para hasExhausted
– Formato: db.<coleccion>.find(...).hasNext( )
– Devuelve false si aun quedan más documentos que leer del
batch actual de entre todos en los que están agrupados los
resultados de la llamada a find.
Métodos de cursores: itcount y limit
• Para itcount
– Formato: db.<coleccion>.find(...).itcount( )
– Devuelve la cantidad faltante de documentos a leer desde el
cursor.
• Para limit
– Formato: db.<coleccion>.find(...).limit(num)
– Especifica que del cursor se obtendrá un máximo de
num documentos.
Métodos de cursores: map
• Formato: db.<coleccion>.find(...).map(function(doc){/*...*/ } )
• Ejecuta la función especificada por cada documento en el
cursor y devuelve un cursor conteniendo el resultado de la
función para ese documento.
• La función debe devolver un valor
• El cursor devuelto no es un cursor nuevo, sino el resultado
de una conversión de tipo.
• Se puede obtener el resultado como un arreglo llamando al
método toArray() del cursor devuelto por map.
Métodos de cursores: tailable
• Formato: db.<coleccion>.find(...).tailable( opts )
• A partir de la versión 3.2, se debe usar el método tailable en
vez de
db.<collection>.find(...).addOption([Link])
(véase addOption para más detalles).
• El parámetro opts es un objeto que puede obtener un único
campo booleano llamado awaitData. Su uso equivale a llamar
a:
db.<collection>.find(...).addOption([Link]).ad
dOption([Link])
• El valor devuelto por este método es un cursor.
Métodos de cursores: maxAwaitTimeMS y maxTimeMS

• Para maxAwaitTimeMS
– Formato: db.<coleccion>.find(...).tailable( {awaitData:
true} ).maxAwaitTimeMS(ms)
– Indica que para el cursor resultante de la llamada a tailable, se
debe esperar un máximo de ms milisegundos por nuevos
documentos que satisfagan las restricciones especificadas en el
parámetro query de find.
• Para maxTimeMS
– Formato: db.<coleccion>.maxTimeMS(ms)
– Indica que se tiene un máximo de ms milisegundos de tiempo límite
acumulativo para operaciones procesando un cursor.
Métodos de cursores: noCursorTimeout y next

• Para noCursorTimeout, véase addOption


• Para next:
– Formato: db.<coleccion>.find(...).next()
– Permite obtener el siguiente documento entre todos los
resultados del cursor (Si se llama por primera vez se obtiene el
primer documento, si se llama por segunda vez, el segundo,
etc.)
– Úsese con el método hasNext() para validar si existe un
siguiente documento a procesar.
Métodos de cursores: objsLeftInBatch
• Formato: db.<coleccion>.find(...).objsLeftInBatch( opts )
• Obtiene la cantidad de documentos restantes en el batch
actual.
• La cantidad de documentos por cada batch depende de
si se llamó al método batchSize y, si es que se le llamó,
con qué parámetro.
Métodos de cursores: pretty
• Formato: db.<coleccion>.find(...).pretty( )
• Despliega el resultado de búsqueda en formato JSON de manera tal
que sea más fácil de leer. Esto implica:
– Se agrega un salto de línea al inicio de un objeto ({)
– Se agrega un salto de línea al término de un objeto (})
– Se agrega un salto de línea al inicio de un arreglo ([)
– Se agrega un salto de línea al término de un arreglo (])
– Se agrega un salto de línea al final después de una coma (,) utilizada para
separar campos o elementos
– Se agrega tantas tabulaciones dependiendo del nivel de profundidad del
campo, arreglo u objeto (uno para cada campo dentro de un objeto, 2 para
cada campo dentro de un objeto que está dentro de otro objeto, etc.)
Métodos de cursores: pretty
• Formato: db.<coleccion>.find(...).pretty( )
• Despliega el resultado de búsqueda en formato JSON de manera tal
que sea más fácil de leer. Esto implica:
– Se agrega un salto de línea al inicio de un objeto ({)
– Se agrega un salto de línea al término de un objeto (})
– Se agrega un salto de línea al inicio de un arreglo ([)
– Se agrega un salto de línea al término de un arreglo (])
– Se agrega un salto de línea al final después de una coma (,) utilizada para
separar campos o elementos
– Se agrega tantas tabulaciones dependiendo del nivel de profundidad del
campo, arreglo u objeto (uno para cada campo dentro de un objeto, 2 para
cada campo dentro de un objeto que está dentro de otro objeto, etc.)
Métodos de cursores: size y skip
• Para size
– Formato: db.<coleccion>.find(...).size( )
– Similar a count, pero size obtiene la cantidad de documentos
después de una llamada a skip y/o a limit
• Para skip
– Formato: db.<coleccion>.find(...).skip(n)
– Obliga a omitir los primeros n registros. En consecuencia, con
la primera llamada a next se obtendrá el documento n+1, con la
segunda el documento n+2, etc.
Métodos de cursores: sort
• Formato: db.<coleccion>.find(...).sort({<campo1>:<ord1>,
<campo2>, <ord2>,...})
• Ordena los resultados obtenidos del método find de
acuerdo a cada <campoN> especificado en el <ordN>
establecido a ese campo. Primero se ordena por el
<campo1>, luego los documentos con <campo1> de igual
valor se ordenan por el <campo2>, etc.
• Cada <ordN> puede ser un 1 para orden ascendente o -1
para orden descendente.
Métodos de cursores: toArray y tryNext
• Para toArray
– Formato: db.<coleccion>.find(...).toArray()
– Permite obtener un arreglo de objetos con todos los
documentos del resultado de búsqueda.
• Para tryNext
– Formato: db.<coleccion>.find(...).tryNext()
– Igual a next, con la diferencia de que si no hay más
documentos que procesar, tryNext devuelve null.
Sentencias de bases de datos
• Tal como se mencionó anteriormente, la base de datos, aparte
de tratar cada colección dentro de ella como si fuera un atributo,
tiene sus propios métodos
• Algunos de estos métodos son una alternativa a métodos y
parámetros específicos sobre una colección
• Otros permite interacciones con otras bases de datos y manejo
de usuarios
• Y otros permiten operaciones sobre colecciones que no están
permitidas de realizar con los metodos propios de cada
colección
Sentencias de bases de datos: adminCommand y
runCommand
• Formato:
– [Link](<cmd>)
– [Link](<cmd>)
• Ambos métodos ejecutan el comando de base de datos especificado en
cmd.
• La única diferencia entre ambos es que el método adminCommand es
equivalente a [Link](“admin”).runCommand(<cmd>), es decir,
ejecuta el comando en la base de datos admin en vez de la actual.
• El parámetro cmd debe ser un objeto BSON cuyo primer campo debe
tener una clave igual a la de un comando reconocido por MongoDB y los
demás campos deben ser argumentos para ese comando.
• Ambos métodos reconocen los mismos comandos.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Formato:
– [Link]({ bulkWrite: 1, ops: <operaciones>, nsInfo:
<colecciones>, ...})
– [Link]({ bulkWrite: 1, ops: <operaciones>, nsInfo:
<colecciones>, ...})
• Equivale a ejecutar el método bulkWrite para una colección
específica como administrador, con la diferencia de que el
comando bulkWrite permite hacer inserciones,
modificaciones y eliminaciones en dos o más colecciones
alojadas en dos o más bases de datos.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• El valor para el campo nsInfo debe ser arreglo de objetos
BSON conteniendo al menos un elemento.
• Cada elemento de nsInfo debe contener un único campo
con clave ns y valor igual a un string conteniendo el
nombre de la base de datos y el nombre de la colección
dentro de esa base de datos, separados ambos nombres
por el caracter punto
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• El valor para el campo ops debe ser un arreglo de objetos,
donde el primer campo de cada objeto representa una
operación sobre una colección y los demás campos son
opciones dependiendo de la operación especificada.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Cada objeto en el arreglo ops debe tener los siguientes
campos:
– insert:
• Campo para indicar que se hará una inserción.
• Este campo y los dos siguientes no deben aparecer al mismo tiempo
en un mismo objeto
• Su valor debe ser un índice entre 0 y la cantidad de elementos en
nsInfo menos 1 para indicar que la operación se hará sobre la
colección ubicada en ese índice en nsInfo.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Cada objeto en el arreglo ops debe tener los siguientes
campos:
– update:
• Campo para indicar que se hará una actualización.
• Este campo, insert y el siguiente campo no deben aparecer al mismo
tiempo en un mismo objeto
• Su valor debe ser un índice entre 0 y la cantidad de elementos en
nsInfo menos 1 para indicar que la operación se hará sobre la
colección ubicada en ese índice en nsInfo.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Cada objeto en el arreglo ops debe tener los siguientes
campos:
– delete:
• Campo para indicar que se hará una eliminación.
• Este campo, y los dos anteriores no deben aparecer al mismo tiempo
en un mismo objeto
• Su valor debe ser un índice entre 0 y la cantidad de elementos en
nsInfo menos 1 para indicar que la operación se hará sobre la
colección ubicada en ese índice en nsInfo.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Cada objeto en el arreglo ops debe tener los siguientes
campos:
– document:
• Aplicable solo dentro de una operación insert
• Debe contener el documento a insertar en la colección especificada
– filter:
• Aplicable para update o delete
• Debe contener un objeto definido del mismo modo que el parámetro
query del método find de cada colección para determinar qué
documentos en la colección serán actualizados o eliminados.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Cada objeto en el arreglo ops debe tener los siguientes
campos:
– updateMods:
• Aplicable solo dentro de una operación update
• Debe contener un objeto definido del mismo modo que en el parámetro
update de los métodos updateOne y updateMany de cada colección
– arrayFilters:
• Aplicable solo dentro de una operación update
• Debe contener un objeto definido del mismo modo que el campo
arrayFilters del parámetro opts de updateOne y updateMany.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Cada objeto en el arreglo ops debe tener los siguientes
campos:
– multi
• Aplicable para las operaciones update y delete
• Este campo es un booleano que sirve para indicar si se actualiza o
elimina el primer documento encontrado que cumpla con el filtro
especificado en filter (false) o con todos los documentos que cumplan
(true)
– arrayFilters:
• Aplicable solo dentro de una operación update
• Debe contener un objeto definido del mismo modo que el campo
arrayFilters del parámetro opts de updateOne y updateMany.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• Además de los campos bulkWrite, ops y nsInfo, se admiten los
siguientes campos:
– ordered: Opcional, booleano para indicar que las operaciones deben
ejecutarse en el orden dado en el arreglo. Si se omite, se asume true
– bypassDocumentValidation. Opcional, booleano para indicar si se ignoran las
reglas de validación de documentos. Si se omite, se asume false.
– let: Opcional. Un objeto conteniendo uno o varios campos con clave y valor
definidos por el programador para poder utilizar dichas claves,
anteponiéndoles el $$, dentro de cualquier campo del cualquier objeto del
arreglo ops.
– cursor: Opcional. Un objeto conteniendo un único campo llamado batchSize
para indicar la cantidad de batches en las que se agruparán los resultados
de búsqueda de las operaciones update y delete.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• El resultado del comando bulkWrite es un objeto que
contiene los siguientes campos:
– numErrors: Número de errores detectados entre todas las
operaciones.
– ok: 1 si todas las operaciones fueron exitosas. 0 en caso
contrario.
Sentencias de bases de datos: Comandos reconocidos:
bulkWrite
• El resultado del comando bulkWrite es un objeto que contiene los
siguientes campos:
– cursor: Un cursor conteniendo el resultado detallado de todas las
operaciones. Contiene los siguientes campos:
• id: Identificador del cursor
• firstBatch: Un arreglo de objetos con una cantidad de elementos igual que la
cantidad de operaciones. Contiene los siguientes campos por cada elemento:
– ok: 1 si la operación fue exitosa, 0 en caso contrario
– idx: índice del elemento en ops con la operación asociada al resultado. 0 para el primer
elemento
– code: Código de error si es que hubo uno
– errMsg: Mensaje asociado al código de error si es que hubo uno.
– n: Cantidad de documentos afectados por la operación
– nModified: Cantidad de documentos modificados si la operacion es update.
Sentencias de bases de datos: Comandos reconocidos:
Ejemplo de bulkWrite (pt. 1)

Se tienen las siguientes dos colecciones en la base de datos test


Sentencias de bases de datos: Comandos reconocidos:
Ejemplo de bulkWrite (pt. 2)
Mediante una única llamada al método adminCommand, realizar las siguientes operaciones:
• Crear dos nuevos documentos en pizzas:
• El primero debe tener _id 5, type “sausage”, size “small” y price 12
• El segundo debe tener _id 6, type “vegan cheese”, size “large” y price 25
• Actualizar el primer documento encontrado en pizzas que tenga type “cheese” asignando a price un
valor igual a 15
• Eliminar el primer documento encontrado en pizzas que tenga el valor de price menor que 7.
• Crear dos nuevos documentos en pizzaOrders
• El primero debe tener _id 3, type “sausage”; number 7 y orderDate igual al 15 de Abril del 2023 a las
12:02:15
• El segundo debe tener _id 4, type “vegan”, number 16 y orderDate igual al 12 de Mayo del 2023 a
las 11:03:11
• Actualizar el primer documento encontrado en pizzaOrders que tenga type “cheese”, asignando un
number igual a 50
• Eliminar el documento con _id 2 de pizzaOrders
• Eliminar el primer documento encontrado en pizzaOrders que tenga un orderDate anterior o igual al 15
de Marzo del 2023 a la medianoche.
Sentencias de bases de datos: Comandos reconocidos:
Ejemplo de bulkWrite (pt. 3)

Aquí, el valor 0 en el campo insert corresponde al índice de ns: “[Link]” en nsInfo y el valor 1 al de ns:
“[Link]” en ese mismo arreglo.
Sentencias de bases de datos: Comandos reconocidos:
Ejemplo de bulkWrite (pt. 4)

A la derecha se muestra la salida de la ejecución


de la sentencia. El valor de idx en cada elemento
de firstBatch corresponde al resultado de la
operación idx-esima establecida en el arreglo ops
al llamar a adminComand
Sentencias de bases de datos: Comandos reconocidos:
cloneCollectionAsCapped
• Formato:
– [Link]({ cloneCollectionAsCapped: <nombreColeccion>, toCollection:
<nombreNuevaColeccion>, size: <n>})
– [Link]({ cloneCollectionAsCapped: <nombreColeccion>, toCollection:
<nombreNuevaColeccion>, size: <n>})
• Crea una nueva colección con los mismos campos de la original. La nueva colección
creada de esta forma se considera una colección “capped” con tamaño fijo <n>. Luego
copia tantos documentos como sea posible desde la colección original hasta lograr
copiarlos todos o hasta alcanzar el tamaño máximo especificado, lo que venga primero.
• Las colecciones “capped” son colecciones de tamaño fijo que, a diferencia de una
colección normal, si se intenta insertar nuevo(s) documento(s) cuando éste alcanza el
tamaño máximo definido, sobrescribe documentos existentes reemplazándolos por
documentos nuevos.
• El valor de <nombreColeccion> y <nombreNuevaColeccion> no deben ser iguales.
Sentencias de bases de datos: Comandos reconocidos:
convertToCapped
• Formato:
– [Link]({ convertToCapped: <nombreColeccion>, size:
<n>})
– [Link]({ convertToCapped: <nombreColeccion>, size:
<n>})
• Convierte la colección especificada en una de tipo “capped”.
Luego, si es necesario, sobrescribe documentos de esa
colección en base al orden en que todos los documentos
fueron insertados (como si fuera una cola FIFO) hasta tener
un tamaño máximo de <n> bytes.
Sentencias de bases de datos: Comandos reconocidos:
create
• Formato:
– [Link]({ create: <nombreColeccion>, ...})
– [Link]({ create: <nombreColeccion>, ...})
• Permite crear una colección. Se diferencia del método
createCollection de una colección en que create también
permite creat vistas y permite hacerlo de manera más
elaborada y personalizada.
Sentencias de bases de datos: Comandos reconocidos:
create
• El objeto parámetro de adminCommand y runCommand
con el comando create admite además los siguientes
campos:
– capped: Campo booleano opcional para indicar si la colección
es de tipo “capped”. Si se omite, se asume false
– expireAfterSeconds: Campo numérico entero opcional para
indicar el tiempo transcurrido antes de que los documentos de
la colección sean eliminados automáticamente. Si se omite, se
asume que no hay límite de tiempo.
Sentencias de bases de datos: Comandos reconocidos:
create
• El objeto parámetro de adminCommand y runCommand con el
comando create admite además los siguientes campos (cont.):
– size: Campo numérico. Obligatorio solo si se especificó capped: true.
Debe indicar el tamaño máximo en bytes que debe tener la colección.
– max: Campo numérico. Obligatorio solo si se especificó capped: true.
Debe indicar la cantidad máxima de documentos que debe tener la
colección. Tenga cuidado, asegúrese que el valor especificado en size
sea lo suficientemente grande para que se llegue al máximo
especificado de documentos.
– validator: Véase Validation. Está prohibido usar este campo con el
método adminCommand.
Sentencias de bases de datos: Comandos reconocidos:
create
• El objeto parámetro de adminCommand y runCommand
con el comando create admite además los siguientes
campos (cont.):
– validationLevel: String opcional indicando el nivel de aplicación
de las reglas de validación que MongoDB aplicará a los
documentos que se intenten insertar o actualizar. Se admiten 3
valores posibles, de los cuales “strict” es el valor por defecto:
• “off”: No validar
• “strict”: Validar a todos los documentos que se inserten o actualicen
• “moderate”: Aplicar validación solo a documentos existentes válidos.
Sentencias de bases de datos: Comandos reconocidos:
create
• El objeto parámetro de adminCommand y runCommand con el
comando create admite además los siguientes campos (cont.):
– validationAction: String opcional indicando la acción a tomar cuando
al intentar insertar o actualizar un documento, este no cumple con
las reglas de validación y el nivel de validación especificado en el
campo validationLevel es “strict” o “moderate”. Se admiten 2 valores
posibles, de los cuales “error” es el valor por defecto:
• “error”: Se interrumpe la operación y se despliega un mensaje de error
• “warn”: Se despliega un mensaje de advertencia, pero se intenta continuar
con la operación.
– collation: véase Collation
Sentencias de bases de datos: Comandos reconocidos:
create
• El objeto parámetro de adminCommand y runCommand con el
comando create admite además los siguientes campos (cont.):
– viewOn: String. Obligatorio si lo que se desea crear es una vista, ya
que se debe indicar sobre qué colección u otra vista se debe crear esta
vista. Debe ser una colección o vista en la base de datos actual.
– pipeline: Obligatorio si lo que se desea crear es una vista. Su valor
debe ser un arreglo conteniendo una o varias etapas reconocidas por
el método aggregate de cada colección excepto $out y $merge. La
primera etapa se aplicará sobre la colección o vista especificada en el
campo viewOn, la segunda sobre el resultado de la primera y así
sucesivamente.
Sentencias de bases de datos: Comandos reconocidos:
collMod
• Formato:
– [Link]({ collMod: <nombreColeccion>, ...})
– [Link]({ collMod: <nombreColeccion>, ...})
• Permite agregar opciones a una colección o modificar la
definición de una vista.
• El valor devuelto es un objeto cuyos campos dependen de
las opciones especificadas en los campos posteriores a
collMod.
• No permite dejar la colección como “capped”. Para eso,
usar el método convertToCapped.
Sentencias de bases de datos: Comandos reconocidos:
collMod
• El objeto usado como parámetro de adminCommand y
runCommand admite los siguientes campos junto con collMod.
Todos ellos funcionan de los campos de igual nombre en el
comando create: validator, validationLevel, validationAction, pipeline,
collation, viewOn, expireAfterSeconds
• Además, a partir de la versión 6.0, también se permiten los siguientes
campos:
– cappedSize: Si la colección es “capped”, se le puede establecer un nuevo tamaño para
ella. Su valor debe ser un número comprendido entre 1 y 1000000000000000 bytes. Si
se omite, se asume el tamaño máximo que tenía originalmente.
– cappedMax: Si la colección es “capped”, se le puede establecer un nuevo máximo de
documentos. Su valor debe ser un número entero. Si se omite o si su valor es negativo,
se asume el límite que tenía originalmente.
Sentencias de bases de datos: Comandos reconocidos:
drop
• Formato:
– [Link]({ drop: <nombreColeccion>})
• Elimina la colección especificada por <nombreColeccion>
de la base de datos actual
• Queda prohibido eliminar colecciones en la base de
datos admin (por esto es que no aparece el formato
con adminCommand) y config.
Sentencias de bases de datos: Comandos reconocidos:
dropDatabase
• Formato:
– [Link]({ dropDatabase: 1})
• Elimina la base de datos actual.
• Queda prohibido eliminar la base de datos admin (por
esto es que no aparece el formato con
adminCommand) y config.
Sentencias de bases de datos: Comandos reconocidos:
dropConnections
• Formato:
– [Link]({ dropConnections: 1, hostAndPort: [...]})
• Permite eliminar conexiones desde la base de datos
hasta las direcciones especificadas en el arreglo
hostAndPort.
• Cada elemento en hostAndPort debe ser un string
conteniendo una URL válida con formato “host:puerto”.
• Este comando solo puede ser ejecutado en la base de
datos admin.
Sentencias de bases de datos: Comandos reconocidos:
getParameter
• Formato:
– [Link]({ getParameter: <?>,<parametro>:<val>})
• Permite obtener uno o todos los parámetros asociados a la base de datos admin.
• El valor asociado a la clave getParameter puede ser:
– 1: Obtener el parámetro especificado en el campo parameter.
– “*”: Obtener todos los parámetros sin importar el valor de parameter.
– Un objeto BSON para indicar que se debe obtener el <parámetro> especificado en el
campo parámeter considerando las siguientes opciones:
• showDetails: Booleano para indicar si se deben mostrar los detalles del parámetro
especificado (true) o no.
• allParameters: Booleano. Aplicable solo si showDetails es true para mostrar los detalles de
todos los parámetros. Se ignora el <parametro>
• El valor de <val> es usando puramente como relleno.
Sentencias de bases de datos: Comandos reconocidos:
getParameter
• El valor devuelto por el comando getParameter es un
objeto cuyo contenido depende del valor del campo
getParameter y del <parametro> especificado:
– Si el valor de getParameter es un 1, el contenido del objeto
devuelto contiene 2 campos. El primero con nombre igual al
<parametro> y valor igual al valor asociado al <parametro>
– Si el valor de getParameter es un “*”, el contenido del objeto es
un campo por cada una de todas las propiedades presentes,
con clave y valor iguales, respectivamente al nombre del
parámetro y su valor.
Sentencias de bases de datos: Comandos reconocidos:
getParameter
• El valor devuelto por el comando getParameter es un objeto cuyo
contenido depende del valor del campo getParameter y del
<parametro> especificado (cont.):
– Si el valor de getParameter es un objeto conteniendo únicamente el
campo showDetails con valor true, el contenido del objeto consiste en
un único campo con clave igual al <parametro> especificado y valor
igual a un objeto BSON conteniendo lo siguiente:
• value: El valor del <parametro>
• settableAtRuntime: Booleano para indicar si el <parámetro> es seteable en
tiempo de ejecución
• settableAtStartup: Booleano para indicar si el <parametro> es seteable cuando
MongoDB se inicie.
Sentencias de bases de datos: Comandos reconocidos:
getParameter
• El valor devuelto por el comando getParameter es un objeto
cuyo contenido depende del valor del campo getParameter y
del <parametro> especificado (cont.):
– Si el valor de getParameter es un objeto conteniendo los campos
showDetails y allParameters y ambos son true, el contenido del objeto
consiste en un campo por cada parámetro en la base de datos admin
con clave igual al nombre de ese parámetro y valor igual a un objeto
conteniendo los campos value, settableAtRuntime y settableAtStartup
• Los valores de cada parámetro dependen de la versión y
configuración específica de su instalación de MongoDB.
Sentencias de bases de datos: Comandos reconocidos:
listCollections
• Formato:
– [Link]({ listCollections: 1, filter: <f>, nameOnly:
<b1>, authorizedCollections:<b2>})
– [Link]({ listCollections: 1, filter: <f>, nameOnly: <b1>,
authorizedCollections:<b2>})
• Permite obtener una lista de todas las colecciones y
vistas presentes actualmente en la base de datos actual.
Sentencias de bases de datos: Comandos reconocidos:
listCollections
• Se admiten las siguientes claves aparte de listCollections:
– filter: Opcional. Sirve para filtrar la lista de colecciones. Debe ser un
objeto definido del mismo modo que el parámetro query del método find.
Si se omite, se asume que no hay restricciones.
– nameOnly: Opcional de tipo booleano. Si su valor es true, solo se
obtendrá, por cada colección y vista, su nombre y su tipo. Si se omite, se
asume false.
– authorizedCollections: Opcional de tipo booleano. Solo tiene efecto si se
incluyó el campo nameOnly con valor true. Si el valor de
authorizedCollections es true, solo se mostrarán aquellas colecciones y
vistas que el usuario está autorizado a utilizar. Si se omite, se asume
false.
Sentencias de bases de datos: Comandos reconocidos:
listCollections
• El valor devuelto depende de la presencia y valor del campo
nameOnly.
• Si nameOnly es false, se obtendrá un objeto con dos
campos:
– ok:Un 1 si la operación fue exitosa; un 0 en caso contrario
– cursor: Un cursor con la lista de las colecciones y vistas
dependiendo de la presencia del campo filter. Contiene los
siguientes campos:
• id: Número de tipo long conteniendo la ID (designada por MongoDB) de la
colección o vista
• ns: Namespace designada por MongoDB para la colección o vista
Sentencias de bases de datos: Comandos reconocidos:
listCollections
• El valor devuelto depende de la presencia y valor del campo nameOnly.
• Si nameOnly es false, se obtendrá un objeto con dos campos:
– ok:Un 1 si la operación fue exitosa; un 0 en caso contrario
– cursor: Un cursor con la lista de las colecciones y vistas dependiendo de la presencia del
campo filter. Contiene los siguientes campos (cont.):
• firstBatch: Un arreglo de objetos conteniendo la información de cada colección y vista
obtenidas. Cada objeto contiene lo siguiente:
– name: Nombre de la colección o vista
– type: Tipo de la colección o vista
– options: Un objeto conteniendo las opciones existentes actualmente para la colección o vista introducidas
con el comando create o collMod del método runCommand o con el método createCollection. Puede estar
vacío.
– info:Un objeto conteniendo la siguiente información:
» readOnly: Booleano para indicar si la colección o vista es de solo lectura. Para las vistas, el valor de
este campo siempre será true.
» uuid: Un objeto UUID conteniendo la uuid de la colección o vista.
– idIndex: Un objeto conteniendo la información de cada índice asociado a la colección. Normalmente
contiene únicamente la información del índice por defecto asociado al campo _id.
Sentencias de bases de datos: Comandos reconocidos:
listCollections
• Si nameOnly es true, cada elemento en firstBatch
contendrá solamente los campos name y type para cada
colección y vista.
Sentencias de bases de datos: Comandos reconocidos:
listDatabases
• Formato:
– [Link]({ listDatabases: 1,...})
– [Link]({ listDatabases: 1...})
• Este comando es similar en comportamiento a listCollections, pero
solo obtiene la lista de bases de datos actualmente existentes.
Además, para obtener bases de datos a los que el usuario actual
tiene acceso, está el campo booleano authorizedDatabases
• Inicialmente solo existen 3 bases de datos creadas
automáticamente por MongoDB: admin, test y config.
• El valor devuelto es un objeto cuyo contenido depende de la
presencia y valor del campo nameOnly.
Sentencias de bases de datos: Comandos reconocidos:
listDatabases
• Si el valor de nameOnly es false, el contenido consiste en los siguientes campos
– databases: Un arreglo de objetos de largo igual a la cantidad actual de bases de datos.
Cada elemento es un objeto conteniendo la siguiente información de una base de datos:
• name: Nombre de la base de datos
• size: Tamaño en bytes de la base de datos
• empty: true si no hay colecciones con datos o false en caso contrario.
– totalSize: La suma en bytes del valor del campo size para todos los elementos en
databases.
– totalSizeMb: La misma suma que el campo anterior expresada en megabytes.
– ok:1 si la operación fue exitosa, 0 en caso contrario.
• Si el valor de nameOnly es true, cada elemento en databases solo mostrará el
campo name.
Sentencias de bases de datos: Comandos reconocidos:
renameCollection
• Formato:
– [Link]({ renameCollection: “<baseDatos>.<coleccion>”,to:
“<baseDatos>.<coleccion>”, dropExisting: <bool>})
– [Link]({ renameCollection: “<baseDatos>.<coleccion>”,to:
“<baseDatos>.<coleccion>”, dropExisting: <bool>})
• Este comando es similar al método renameCollection de cada colección,
con la diferencia de que para el comando renameCollection, si el nombre
de la base de datos en el campo to es distinto que el del campo
renameCollection, la colección en la base de datos origen es copiada con
todos sus documentos a la base de datos destino con el nuevo nombre
especificado y luego la colección en la base de datos origen es eliminada.
Sentencias de bases de datos: Comandos reconocidos:
setParameter
• Formato:
– [Link]({ setParameter: 1, <parametro>: valor})
• Este comando agrega a la base de datos admin nuevo
<parametro> con su <valor>.
Sentencias de bases de datos: Comandos reconocidos:
shutdown
• Formato:
– [Link]({ shutdown: 1, force: <bool>, timeoutSecs: <secs>)
• Este comando termina el proceso de ejecución de la base de
datos. Esto solo puede hacerse contra la base d edatos admin.
• Se admiten los siguientes campos además de shutdown:
– force: Booleano opcional. Si su valor es true, se fuerza el apagado. Si se
omite, se asume false
– timeoutSecs: Opcional. Cantidad máxima de segundos que tienen todas
las operaciones actualmente en ejecución para poder completarse antes
del apagado. Si se omite, no hay tiempo de espera.
Sentencias de bases de datos: Comandos reconocidos:
validate
• Formato:
– [Link]({validate: <coleccion>, full: <bool>, repair: <bool>, checkBSONConformance:
<bool>)
• Este comando realiza la validación de la colección especificada por medio del validador
incorporado a ésta (véase Validación) o el validador por defecto si no se incorporó
alguno.
• A excepción de validate, todos los demás campos son booleanos y opcionales.
– full: Si su valor es true, se hace una validación más lenta pero más detallada. Si se omite, se
asume false.
– repair: Si su valor es true, se reparará automáticamente cualquier error de validación en la
colección. Es obligatorio omitir este campo si checkBSONConformance es true. Si se omite, se
asume false.
– checkBSONConformance: Si su valor es true, se valida que todos los documentos hayan sido
insertados o actualizados en conformidad con las especificaciones de BSON. Si se omite, se
asume el valor del campo full (false si no está presente)
Sentencias de bases de datos: Comandos reconocidos:
validate
• El valor devuelto por este comando es un objeto
conteniendo, entre otros, los siguientes campos:
– uuid: La UUID de la colección
– nInvalidDocuments: Número de documentos inválidos
– nNonCompliantDocuments: Número de documentos que no se
ajustan al esquema especificado para la colección
– nrecords: Total de documentos en la colección
– ns: El nombre de la colección en formato
<base_de_datos>.<coleccion>
– valid: true si todos los aspectos de la colección son válidos
Sentencias de bases de datos: Comandos reconocidos:
validate
• El valor devuelto por este comando es un objeto conteniendo, entre
otros, los siguientes campos (cont):
– repaired: true si se ejecutó el comando con repair igual a true y se lograron
reparar todos los documentos con errores de validación; false en caso contrario.
– warnings: Un arreglo de Strings con mensajes de advertencia. Puede estar vacío.
Que este arreglo no esté vacío no significa que la colección haya fallado su
validación.
– errors: Un String indicando el mensaje de error obtenido en caso de que la
colección haya fallado su validación.
– corruptRecords: Un arreglo de long conteniendo los números de cada registro
con errores
– ok: 1 si el comando se ejecutó con éxito; 0 en caso contrario.
Sentencias de bases de datos: Comandos reconocidos:
aggregate
• Formato:
– [Link]({ aggregate: <coleccion>, pipeline:
<etapas>,...})
• Este comando equivale a:
db.<coleccion>.aggregate(<etapas>, {...})
• Además de los campos aggregate y pipeline, se permiten
los mismos campos que el segundo argumento del
método pipeline (options) con sus respectivos valores.
Sentencias de bases de datos: Comandos reconocidos:
count
• Formato:
– [Link]({ count: <coleccion>, query: <filtro>,...})
• Este comando equivale a:
db.<coleccion>.count(<filtro>, {...}), con la diferencia de
que para el comando count, el campo count también
puede ser igual al nombre de una vista.
• Además de los campos count y query, se permite los
campos limit, skip, maxTimeMS y collation del mismo
modo que en el método count.
Sentencias de bases de datos: Comandos reconocidos:
distinct
• Formato:
– [Link]({ distinct: <coleccion>, key: <campo>, query:
<filtro>, collation: <coll>})
• Este comando equivale a:
db.<coleccion>.distinct(<campo>, <filtro>, {collation:
<coll>}).
• No es necesario especificar un collation.
Sentencias de bases de datos: Comandos reconocidos:
delete
• Formato:
– [Link]({ delete: <coleccion>, deletes: [<objs>], let:
{<vars>}, ordered: <bool>, maxTimeMS: <int>})
• Este comando permite de forma más elaborada eliminar
uno o varios documentos de una <colección>.
Sentencias de bases de datos: Comandos reconocidos:
delete
• El campo deletes debe ser un arreglo de objetos
conteniendo al menos un elemento. Cada elemento debe
contener los siguientes campos:
– q: Su valor debe ser un objeto definido del mismo modo que el
parámetro query del método find de cada colección. Sirve para
filtrar los documentos a eliminar.
– limit: Un cero para eliminarlos todos o un 1 para
eliminar el primero que encuentre
– collation: véase Collation
Sentencias de bases de datos: Comandos reconocidos:
delete
• El campo let permite definir una o varias variables del
mismo modo que el campo let en otros métodos donde
es requerido
• El campo ordered debe tener valor true si se desea tomar
cada elemento de deletes en el orden dado o false para
orden aleatorio
• El campo maxTimeMS permite indicar el tiempo límite
para ejecutar todas las eliminaciones. Si se omite, se
asume que no hay límite de tiempo
Sentencias de bases de datos: Comandos reconocidos:
find
• Formato:
– [Link]({ find: <coleccion>, ...})
• Este comando permite de forma más elaborada buscar uno o más
documentos en la colección.
• Además del campo find, este comando también reconoce los campos
filter, sort, projection, skip, limit, batchSize, singleBatch, maxTimeMS,
max, min, showRecordId, tailable, noCursorTimeout, awaitData,
allowPartialResults, collation, allowDiskUse y let del mismo modo que
los parámetros del método find.
• El nombre de la colección se puede reemplazar por la función UUID
con un argumento igual a un String con el uuid de la colección
deseada
Sentencias de bases de datos: Comandos reconocidos:
findAndModify
• Formato:
– [Link]({ findAndModify: <coleccion>, ...})
• Este comando es equivalente al método findAndModify
de cada colección.
• Además del campo findAndModify, este comando
también reconoce los campos query, sort, remove,
update, new, fields, upsert, bypassDocumentValidation.
maxTimeMS, collation, arrayFilters y let del mismo modo
que los parámetros del método findAndModify.
Sentencias de bases de datos: Comandos reconocidos:
insert
• Formato:
– [Link]({ insert: <coleccion>, documents: [<documentos>],
ordered: <bool>, maxTimeMS: <long>, bypassDocumentValidation:
<bool>})
• Dependiendo de la cantidad de documentos en documents,
este comando puede ser equivalente a llamar a insertOne o
insertMany para la colección especificada en el campo insert.
• Los campos ordered, maxTimeMS y
bypassDocumentValidation funcionan del mismo modo que
en otros métodos.
Sentencias de bases de datos: Comandos reconocidos:
update
• Formato:
– [Link]({ update: <coleccion>, updates: [<objs>], ordered:
<bool>, maxTimeMS: <long>, bypassDocumentValidation: <bool>,
let: {<vars>}})
• Este comando permite hacer una o varias actualizaciones,
cada una a uno o todos los documentos que cumplan con su
correspondiente filtro
• Los campos ordered, maxTimeMS,
bypassDocumentValidation y ley funcionan del mismo modo
que en otros métodos donde se les requiere
Sentencias de bases de datos: Comandos reconocidos:
update
• Cada elemento en el arreglo updates es un objeto que puede contener los
siguientes campos:
– q: El objeto con el filtro que deben cumplir los documentos que serán actualizados.
Funciona del mismo modo que el parámetro query del método find de cada colección
– u: Las actualizaciones a realizar. Funciona del mismo modo que el parámetro update del
método update de cada colección
– c: Igual que el campo let, pero las variables definidas en c solo son reconocidas en los
valores de q y u.
– multi: Booleano para indicar si se actualizan todos los documentos encontrados (true) o
solo el primer documento encontrado (false)
– upsert: Booleano para indicar si se debe insertar un nuevo documento en caso de que
no se encuentren documentos que cumplan con lo especificado en q.
– collation: véase Collation
– arrayFilters: Funciona del mismo modo que en otros métodos que lo requieren.
Sentencias de bases de datos: Comandos reconocidos:
createUser y updateUser
• Formato:
– [Link]({ createUser: <nombre>, pwd: <clave>, customData: <obj>, roles:
[<objR>], authenticationRestrictions: [<objAR>], mechanisms: [<mecs>], digestPassword:
<bool>})
– [Link]({ updateUser: <nombre>, pwd: <clave>, customData: <obj>, roles:
[<objR>], authenticationRestrictions: [<objAR>], mechanisms: [<mecs>], digestPassword:
<bool>})
• El comando addUser equivale al método createUser del objeto db con los mismos
campos especificados en el lugar correcto.
• El comando updateUser permite actualizar las propiedades de un usuario existente
(contraseña, roles, etc.). Los campos para este comando, excepto updateUser,
funcionan del mismo modo que para el comando addUser.
• Al igual que con el método createUser, se puede usar la llamada a
passwordPrompt() en vez de un string para el campo pwd en cada método.
Sentencias de bases de datos: Comandos reconocidos:
dropUser y dropAllUsersFromDatabase
• Formato:
– [Link]({ dropUser: <nombre_usuario>})
– [Link]({ dropAllUsersFromDatabase: 1 })
• El comando dropUser elimina el usuario especificado por
<nombre_usuario> de la base de datos actual
• El comando dropAllUsersFromDatabase elimina todos los
usuarios de la base de datos actual.
Sentencias de bases de datos: Comandos reconocidos:
grantRolesToUser y revokeRulesFromUser
• Formato:
– [Link]({ grantRolesToUser: <usuario>, roles: [<roles>]})
– [Link]({ revokeRolesFromUser: <usuario>, roles:
[<roles>]})
• Estos comandos permiten, respectivamente, otorgar o
revocar todos los roles especificados en el arreglo roles al
<usuario> especificado
• Cada elemento en roles puede ser un string o un objeto
definidos del mismo modo que en el método createUser del
objeto db.
Sentencias de bases de datos: Comandos reconocidos:
usersInfo
• Formato: [Link]({ usersInfo: <?>, showCredentials:
<bool>, showCustomData: <bool>, showPrivileges: <bool>,
showAuthenticationRestrictions: <bool>, filter: <obj>})
• Este comando permite obtener la información de uno o
varios usuarios en la base de datos actual o en todas las
bases de datos.
Sentencias de bases de datos: Comandos reconocidos:
usersInfo
• El valor del campo usersInfo puede ser uno de los siguientes.
Cada uno de ellos representa qué usuario(s) buscar:
– 1: Buscar todos los usuarios de la base de datos actual
– <nombre_usuario>: Buscar el usuario con el nombre especificado
– {user: <nombre_usuario>, db: <nombre_bd>}: Buscar el usuario
especificado en la base de datos especificada
– Un arreglo de Strings para indicar que se debe buscar un usuario con
cada nombre especificado en la base de datos actual
– Un arreglo de objetos donde cada objeto debe tener los campos user y
db. Esto, para buscar uno o más usuarios en una o más bases de
datos
– {forAllDBs: true}: buscar todos los usuarios en todas las bases de
datos
Sentencias de bases de datos: Comandos reconocidos:
usersInfo
• El valor de los demás campos admitidos debe ser un booleano,
excepto donde se indique. Además, cada uno de esos campos es
opcional:
– showCredentials: Si su valor es true, se debe mostrar también el hash de la
contraseña por cada usuario encontrado. Si se omite, se asume false.
– showCustomData: Si su valor es true, se debe mostrar también los datos
personalizados de cada usuario encontrado. Si se omite, se asume true.
– showPrivileges: Si su valor es true, se debe mostrar también la lista completa
de privilegios por cada usuario encontrado. Si se omite, se asume false. Es
obligatorio omitir este campo si el valor del campo usersInfo constituye la
obtención de todos los usuarios en una o todas las bases de datos.
Sentencias de bases de datos: Comandos reconocidos:
usersInfo
• El valor de los demás campos admitidos debe ser un booleano,
excepto donde se indique. Además, cada uno de esos campos es
opcional (cont):
– showAuthenticationRestrictions: Si su valor es true, se debe mostrar
también todas las restricciones de autentificación impuestas sobre los
usuarios encontrados. Si se omite, se asume false
– filter: Su valor debe ser un objeto definido del mismo modo que la
etapa $match del método agregate, pero considerando solamente
campos específicos de la tabla interna de usuarios que tiene cada
base de datos. Véase el valor devuelto por este comando para más
detalles de los campos posibles para filtrar. Si se omite, se asume que
no hay filtro.
Sentencias de bases de datos: Comandos reconocidos:
usersInfo
• El valor devuelto por este comando es un objeto con la siguiente
información:
– ok:Un 1 si la operación fue exitosa o un 0 en caso contrario.
– users: Un arreglo de objetos donde cada elemento contiene los siguientes
campos con sus valores por cada usuario encontrado:
• _id: Un string igual a <base_de_datos>.<nombre_usuario>
• userId: El UUID designado por MongoDB para el usuario
• user: El nombre de usuario
• db: La base de datos a la que pertenece el usuario
• mechanisms: Un arreglo de strings con cada mecanismo asociado al usuario
• customData: Un objeto con los datos personalizados del usuario
• roles: Un arreglo con elementos strings y/u objetos para representar cada rol que
tiene el usuario en la base de datos
Sentencias de bases de datos: Comandos reconocidos:
usersInfo
• El valor devuelto por este comando es un objeto con la siguiente
información:
– users: Un arreglo de objetos donde cada elemento contiene los siguientes
campos con sus valores por cada usuario encontrado (cont):
• credentials: Un objeto con la información de las credenciales de acceso, incluyendo el
hash de la contraseña. Presente solo si showCredentials es true
• inheritedRoles: Un arreglo de roles heredados. Presente solo si showPrivileges o
showAuthenticationRestrictions es true.
• inheritedPrivileges: Un arreglo de privilegios heredados. Presente solo si se cumplen las
mismas condiciones que el campo anterior.
• inheritedAuthenticationRestrictions: Un arreglo de restricciones heredadas de
autentificación. Presente solo si se cumplen las mismas condiciones que el campo
anterior
• authenticationRestrictions: Un arreglo de restricciones no heredadas de autentificación.
Presente solo si showAuthenticationRestrictions es true.
Sentencias de bases de datos: Comandos reconocidos:
Ejemplo de usersInfo
• Obtener una lista de todos los usuarios de todas las
bases de datos que usen el mecanismo SHAM-SHA-1
Sentencias de bases de datos: Comandos reconocidos:
createRole y updateRole
• Formato:
– [Link]({ createRole: <?>, ...})
– [Link]({updateRole: <rol>, ...})
• Estos comandos permiten, respectivamente, crear un
nuevo rol en una base de datos cualquiera o modificar un
rol existente en la base de datos actual.
• Todos los campos aparte de createRole y updateRole
son admitidos también en el parámetro del método
createRole de cada base de datos. Se verá el método
más adelante.
Sentencias de bases de datos: Comandos reconocidos:
createRole
• Los campos reconocidos además de createRole son:
– privileges: Obligatorio. Un arreglo de objetos para asociar cero o más
privilegios al rol nuevo. Cada elemento en el arreglo es un objeto que
debe tener los siguientes campos:
• resource: Un objeto que hace referencia a una base de datos y a
una colección dentro de ella sobre la cual se tendrá el privilegio.
Para ello, este objeto admite, respectivamente, los campos db y
collection.
• actions: Un arreglo de Strings con uno o varios elementos que
representan las acciones permitidas sobre el recurso especificado
que un usuario con el nuevo rol tendrá. Más tarde se mostrará una
lista de acciones admitidos por MongoDB
Sentencias de bases de datos: Comandos reconocidos:
createRole
• Los campos reconocidos además de createRole son:
– roles: Obligatorio. Un arreglo de objetos y/o strings
para indicar que el nuevo rol heredará todos los
privilegios de cero o más roles ya existentes. Cada
elemento en el arreglo puede ser:
• Un string indicando el nombre de un rol para indicar que es
un rol existente en la base de datos actual
• Un objeto con los campos role y db para indicar que es un
rol existente en la base de datos especificada.
Sentencias de bases de datos: Comandos reconocidos:
createRole
• Los campos reconocidos además de createRole son:
– authenthicationRestrictions: Opcional. Debe ser
definido del mismo modo que el campo con el mismo
nombre en otros métodos donde es admitido
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole

• find: Acción de ejecutar cualquiera de los


siguientes métodos o comandos:

(*) Para cualquier etapa(s) incluida en el método o comando aggregate excepto $out
(**) Solo para cursores asociados a un usuario actualmente autentificado.

– Requerido para los métodos findAndModify, cloneCollectionAsCapped y renameCollection y sus respectivos


comandos equivalentes.
– Si el usuario no tiene la acción listDatabases, aun puede listar bases de datos con el método listDatabases,
pero solo aquellas para las que el usuario tiene acceso y solo incluyendo el campo authorizedDatabases igual
a true
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• insert: Acción de insertar documentos o crear registros con los métodos
insert y create o equivalentes.
– Requerido para las etapas $out y $merge en el método aggregate y su comando
equivalente
– Requerido para los métodos update y findAndModify, y sus comandos
equivalentes, con upsert igual a true
– Requerido para los métodos cloneCollectionAsCapped y renameCollection y sus
comandos equivalentes.
• remove: Acción de eliminar documentos con el método delete o equivalente.
– Requerido para el método findAndModify y su comando equivalente en caso de
que se desee eliminar documentos
– Requerido para la etapa $out en el método aggregate y su comando equivalente.
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• update: Acción de actualizar documentos con el
método update o equivalente. Requerido para el
método findAndModify y su comando asociado.
• bypassDocumentValidation: Acción de ignorar
validación de documentos con cualquier método o
comando que requiera del campo
bypassDocumentValidation
• useUUID: acción de usar un UUID para buscar
colecciones con el método find o equivalente.
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• changeCustomData: Acción de un usuario de cambiar
los datos personalizados de cualquier usuario(s)
• changeOwnCustomData: Acción de un usuario de
cambiar sus propios datos personalizados
• changeOwnPassword: Acción de un usuario de
cambiar su propia contraseña.
• changePassword: Acción de un usuario de cambiar la
contraseña de cualquier usuario(s)
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• createCollection: Acción de crear una colección(es)
• createRole: Acción de crear un rol(es)
• createUser: Acción de crear un usuario(s)
• dropCollection: Acción de eliminar una colección(es)
• dropRole: Acción de eliminar un rol(es)
• dropUser: Acción de eliminar un usuario(s)
• grantRole: Acción de otorgar un rol(es) a cualquier
usuario(s) en cualquier base de dato(s)
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• killCursors: Acción de un usuario de liberar sus
propios cursores. A partir de la versión 4.2, esta
acción no surge efecto, ya que un usuario siempre
estará autorizado para matar sus propios cursores.
• killAnyCursor: Acción de un usuario de matar
cualquier cursor creado por cualquier usuario
• revokeRole: Acción de revocar roles a cualquier
usuario en cualquier base de datos.
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• setAuthenticationRestriction: Acción de especificar
restricciones de autentificación al ejecutar los métodos
createUser y updateUser y sus respectivos comandos
equivalentes.
– Acción habilitada por defecto sobre todas las colecciones para todos
los usuarios que tengan el rol userAdmin o userAdminAnyDatabase.
• viewRole: Acción de visualizar cualquier rol
• viewUser: Acción de visualizar la información de cualquier
usuario
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• collMod: Acción de ejecutar el comando collMod
• convertToCapped: Acción de ejecutar el comando convertToCapped
• dropConnections: Acción de ejecutar el comando dropConnections
• dropDatabase: Acción de ejecutar el comando dropDatabase
• getParameter: acción de ejecutar el comando getParameter
• hostInfo: Acción de obtener información acerca del host donde
MongoDB se está ejecutando
• renameCollectionSameDB: Acción de ejecutar el comando
renameCollection para cambiar el nombre de una colección sin
cambiar de base de datos esa colección.
Sentencias de bases de datos: Comandos reconocidos:
acciones de privilegios reconocidos por createRole
• setParameter: Acción de ejecutar el comando setParameter
• shutdown: Acción de ejecutar el comando shutdown
• listDatabases: Acción de ejecutar el comando listDatabases
• listCollections: Acción de ejecutar el comando
listCollections
• validate: Acción de ejecutar el comando validate.
• anyAction: Equivale a todas las acciones. No usar a menos
que sea absolutamente necesario
• internal: Permite acciones internas. No usar a menos que
sea absolutamente necesario
Sentencias de bases de datos: Comandos reconocidos:
dropRole y dropAllRolesFromDatabase
• Formato:
– [Link]({dropRole: <nombreRol>})
– [Link]({dropAllRolesFromDatabase: 1})
• El comando dropRole permite eliminar el rol con el
nombre especificado.
– Solo se pueden eliminar roles definidos por el usuario.
• El comando dropAllRolesFromDatabase permite eliminar
todos los roles definidos por el usuario en la base de
datos actual.
Sentencias de bases de datos: Comandos reconocidos:
grantPrivilegesToRole y revokePrivilegesFromRole
• Formato:
– [Link]({grantPrivilegesToRole: <nombreRol>, privileges:
[<privilegios>]})
– [Link]({revokePrivilegesFromRole: <nombreRol>, privileges:
[<privilegios>]})
• Permiten, respectivamente, agregar más privilegios a un rol
existente o remover los privilegios especificados de un rol
existente.
• El arreglo privileges debe tener al menos un objeto definido del
mismo modo que para el campo privileges del comando
createRole.
Sentencias de bases de datos: Comandos reconocidos:
grantRolesToRole y revokeRolesFromRole
• Formato:
– [Link]({grantRolesToRole: <nombreRol>, roles: [<roles>]})
– [Link]({revokeRolesFromRole: <nombreRol>, roles:
[<roles>]})
• Permiten a un rol existente, respectivamente, heredar todos los
privilegios de los roles especificados en el campo roles en
adición a los ya heredados previamente o revocar todos los
privilegios heredados de los roles especificados.
• El arreglo roles debe tener al menos un objeto definido del
mismo modo que para el campo roles del comando createRole.
Sentencias de bases de datos: Comandos
Reconocidos: rolesInfo
• Formato: [Link]({rolesInfo: <?>,
showAuthenticationRestrictions: <bool>, showBuiltinRoles:
<bool>, showPrivileges: <bool>})
• Permite obtener información de uno o varios roles.
• Los campos showAuthenticationRestrictions y
showPrivileges funcionan del mismo modo que con el
comando usersInfo, pero para roles.
Sentencias de bases de datos: Comandos reconocidos:
rolesInfo
• El valor del campo rolesInfo puede ser:
– Un 1, para consultar por todos los roles en la base de datos actual.
– Un string con el nombre de un rol para consultar por el rol específico en la base de datos
actual
– Un objeto conteniendo los campos role y db para consultar por el rol específico en una base
de datos específica
– Un arreglo de strings para consultar por dos o más roles específicos en la base de datos
actual
– Un arreglo de objetos, con cada uno conteniendo los campos role y db para consultar por dos
o más roles en una o más bases de datos
• El campo showBuiltinRoles solo aplica si el valor de rolesInfo es 1. Si
showBuiltinRoles es true, se mostrarán todos los roles definidos por MongoDB en
adición a los que fueron definidos por el usuario. En caso contrario, se mostrarán
solamente los roles definidos por el usuario. Si se omite, se asume false.
Sentencias de bases de datos: Comandos reconocidos:
rolesInfo
• El valor devuelto por este comando es un arreglo de objetos, donde cada objeto
contiene los siguientes campos:
– role: El nombre del rol
– db: El nombre de la base de datos donde fue creado el rol
– isBuiltin: true si el rol fue creado por MongoDB, false si fue creado por un usuario. Si
showBuiltinRoles es false, asuma que el valor de este campo para todos los roles
encontrados es false.
– inheritedRoles: Un arreglo de objetos, donde cada objeto contiene los campos role y db
para representar un rol heredado por un rol consultado
– privileges: Un arreglo de objetos, donde cada objeto contiene los campos resource y
actions para representar un privilegio adquirido directamente por el rol consultado, es
decir, que no ha sido heredado de otros roles.
– inheritedPrivileges: Igual que el anterior, pero solo con privilegios heredados de otros
roles.
Sentencias de bases de datos: Comandos
Reconocidos: buildInfo y connPoolStats
• Para buildInfo:
• Formato: [Link]({buildInfo: 1})
• Permite obtener el resumen de compilación del programa
mongod en un objeto BSON.
• Para connPoolStats:
• Formato: [Link]({connPoolStats: 1})
• Permite obtener, en un objeto BSON, información acerca de las
conexiones abiertas salientes desde la base de datos actual
hasta otros miembros del set de réplicas o similar.
Sentencias de bases de datos: Comandos
Reconocidos: conectionStatus
• Formato: [Link]({connectionStatus: 1,
showPrivileges: <bool>})
• Permite obtener, en un objeto BSON el estado de los
usuarios actualmente autentificados y sus privilegios
dentro de la conexión actual.
• El campo showPrivileges es opcional.
• Si su valor es true, se muestran todos los privilegios que los
usuarios poseen actualmente.
• Si se omite este campo, se asume false.
Sentencias de bases de datos: Comandos
Reconocidos: dataSize
• Formato: [Link]({dataSize: <coll>, ...})
• Permite obtener el tamaño en bytes de los datos en la colección <coll>.
• Se admiten adicionalmente los siguientes campos opcionales:
• keyPattern: Un documento conteniendo la definición de un índice (tal como se pasó
como parámetro a createIndex o createIndexes) a examinar.
• Si el valor para esta clave no tiene el formato correcto, se obtendrá un error.
• min: El valor mínimo del rango de valores del(de los) campo(s) especificado(s) en
keyPattern
• max: El valor máximo del rango de valores del(de los) campo(s) especificado(s) en
keyPattern
• estimate: Booleano. Si su valor es true, se asume que todos los documentos en el
rango están uniformemente del mismo tamaño que el tamaño promedio de un
documento en la colección. Si se omite este campo, se asume false.
Sentencias de bases de datos: Comandos
Reconocidos: dbHash
• Formato: [Link]({dbHash: 1, collections: [<colls>]})
• Permite obtener los valores hash y un valor MD5 para
todas las colecciones especificadas en colls
• El campo collections es opcional. Si se omite, se asume
que se obtendrá el hash y el MD5 de todas las
colecciones actualmente en la base de datos
• ADVERTENCIA: Ejecutar este comando previene toda
operación de escritura sobre la base de datos hasta que
su ejecución termine.
Sentencias de bases de datos: Comandos
Reconocidos: dbStats
• Formato: [Link]({dbStats: 1, scale: <num>, freeStorage: <num>})
• Permite obtener estadísticos de almacenamiento para la base de datos
actual
• El campo scale es opcional. Sirve para indicar el factor de escala para
los diversos datos de tamaño en disco en bytes. Si se omite, se asume
un byte.
• Si el valor de scale tiene decimales, éste se truncará automáticamente.
• El campo freeStorage es opcional y acepta como valores un cero o un
1. Si su valor es 1, se incluye también información detallada del
espacio libre en disco asignado a cada colección. Si el campo se omite,
se asume un cero.
Sentencias de bases de datos: Comandos
Reconocidos: explain
• Formato: [Link]({explain: <cmd>, verbosity: <str>, comment: <?>})
• Este comando es similar al método explain de una colección, con la
diferencia de que el comando explain se usa con los siguientes comandos:
aggregate, count, distinct, find, findAndModify, delete, mapReduce y update.
• El valor del campo explain debe ser cualquier objeto BSON admitido como
parámetro del método runCommand para cualquiera de los comandos
listados arriba.
• El campo verbosity es opcional y admite los mismos valores String del
parámetro del método explain.
• El campo comment es opcional y admite un valor de cualquier tipo. Usado
solo para logging.
Sentencias de bases de datos: Comandos
Reconocidos: getCmdLineOpts y getLog
• Para getCmdLineOpts
• Formato: [Link]({getCmdLineOpts: 1})
• Este comando permite desplegar todas las opciones de línea de
comandos para el programa mongod en formato BSON.
• Para getLog:
• Formato: [Link]({getLog: “<val>”})
• Permite obtener el contenido del log para el proceso actual
• Se admite uno de los siguientes valores:
• *: Obtener un arreglo con todos los demás valores posibles de <val>
• global: Obtener un arreglo con la salida combinada de todos los logs
• startupWarnings: Obtener un arreglo con todas las líneas de log que PUEDAN tener
mensajes de error o de advertencias. El arreglo puede estar vacío.
Sentencias de bases de datos: Comandos
Reconocidos: hostInfo y listCommands
• Para hostInfo
• Formato: [Link]({hostInfo: 1})
• Este comando permite obtener la información del host donde está
operando el servidor de la base de datos en formato BSON.
• ADVERTENCIA: El contenido del objeto devuelto es “plataforma-
dependiente”.
• Para listCommands:
• Formato: [Link]({listCommands: 1})
• Permite obtener una lista de todos los comandos actualmente
disponibles para ejecutar con el método runCommand o
adminCommand.
Sentencias de bases de datos: Comandos
Reconocidos: lockInfo y ping
• Para lockInfo
• Formato: [Link]({lockInfo: 1})
• Este comando permite obtener, en formato BSON, la
información de todos los cerrojos antiguos o pendientes que
pudieran bloquear operaciones sobre la base de datos.
• Para ping:
• Formato: [Link]({ping: 1})
• Permite probar si el servidor está actualmente respondiendo a
solicitudes de ejecución de comandos.
Sentencias de bases de datos: Comandos
Reconocidos: serverStatus
• Formato: [Link]({serverStatus: 1})
• Este comando permite obtener, en formato BSON, el
estado del servidor MongoDB.
Sentencias de bases de datos: Comandos
Reconocidos: top
• Formato: [Link]({top: 1})
• Permite obtener la siguiente información por cada
colección en la base de datos actual:
• El tiempo en microsegundos que cada evento se demora en
ejecutar
• La cantidad de eventos que cada evento ha sido ejecutado
• Cada vez que se reinicie el servidor, se reinicia la
información listada arriba.
Sentencias de bases de datos: Comandos
Reconocidos: top
• MongoDB reconoce los siguientes eventos:
• readLock: Operaciones que durante su ejecución evitan que se lean documentos
de una colección
• writeLock: Operaciones que durante su ejecución evitan que se inserten,
modifiquen o eliminen documentos de una colección
• total: Equivale a readLock y writeLock.
• queries: Operaciones de consultas como el método find
• getMore: Ejecución del comando getMore
• insert: Operaciones de insersión de documentos
• update: Operaciones de actualización de documentos
• remove: Operaciones de eliminación de documentos.
• commands: Operaciones de ejecuciones de comandos. Especialmente
agregaciones y manejo de índices.
Sentencias de bases de datos: Comandos
Reconocidos: validateDBMetadata
• Formato: [Link]({validateDBMetadata: 1, ...})
• Permite chequear que el metadato almacenado de una base de datos o una colección sea válido
de acuerdo a una versión particular de la API de MongoDB
• Se admiten los siguientes campos adicionales:
• apiParameters: Obligatorio para especificar parámetros de la API. Debe ser un objeto BSON
conteniendo los siguientes campos obligatorios:
• version: Un String con la versión de la API. Hasta el momento el único valor posible para este campo es “1”
• strict: Un booleano. Si su valor es true, se incluirán respuestas de errores de validación.
• deprecationErrors: Un booleano. Si su valor es true, se incluirán respuestas por uso de metadatos deprecados.
• db: Opcional. Debe ser un String con el nombre de una base de datos. Si se omite, se asume que el
chequeo se hará en todas las bases de datos.
• collection: Opcional. Debe ser un String con el nombre de una colección en la base de datos db. Si
collection se omite, pero db está presente, el chequeo se hará en todas las colecciones de la base de
datos. Si db y collection se omiten, el chequeo se hará en todas las colecciones de todas las bases de
datos.
• ADVERTENCIA: Este comando NO corrige los errores reportados.
Sentencias de bases de datos: Comandos
reconocidos de índices
• Además, se tienen los siguientes comandos para manejo
de índices. Estos serán vistos en más detalle en la
sección Índices:
• createIndexes
• compact
• dropIndexes
• listIndexes
Sentencias de bases de datos: commandHelp

• Formato: [Link](<comando>)
• Permite obtener la ayuda acerca del <comando>
especificado.
Sentencias de bases de datos: createRole
• Formato: [Link]({role: <nombreRol>, ...})
• La llamada a este método equivale a:
[Link]({createRole: <nombreRol>,...})
• Véase el comando createRole para más detalles
Sentencias de bases de datos: createCollection

• Formato: [Link](<nombre>, <opciones>)


• La llamada a este método equivale a:
[Link](create: <nombre>, <contenido de
<opciones>) para crear una colección
• Dentro de <opciones> no se permiten las claves viewOn
y pipeline, ya que estas solo sirven para crear vistas.
• El parámetro opciones es opcional.
Sentencias de bases de datos: createView
• Formato: [Link](<nombre>, <src>, <etapas>, <coll>)
• Permite crear una vista sobre una colección u otra vista.
• La llamada a este método equivale a:
[Link]({
create: <nombre>,
viewOn: <src>,
pipeline: <etapas>,
collation: <coll>
})
Sentencias de bases de datos: dropDatabase

• Formato: [Link]()
• Elimina la base de datos actual.
• La llamada a este método equivale a:
[Link](dropDatabase: 1)
Sentencias de bases de datos: getCollection

• Formato: [Link](<nombreColeccion>)
• Obtiene un objeto haciendo referencia a la colección
especificada en la base de datos actual.
• Llamar a este método equivale a:
db.<nombreColeccion>
Sentencias de bases de datos: getCollectionInfos

• Formato: [Link](<filter>, <nameOnly>,


<authColl>)
• Llamar a este método equivale a:
[Link]({
listCollections:1,
filter: <filter>,
nameOnly: <nameOnly>,
authorizedCollections: <authColl>
})
Sentencias de bases de datos: getCollectionNames

• Formato: [Link]()
• Llamar a este método equivale a:
[Link]({
listCollections:1,
nameOnly: true
})
Sentencias de bases de datos: getMongo y getName

• Para getMongo:
– Formato: [Link]()
– Permite obtener la conexión actual.
– Úsese solo para probar si la conexión actual sigue activa.
• Para getName:
– Formato: [Link]()
– Obtiene el nombre de la base de datos actual.
Sentencias de bases de datos: getSibilingDB

• Formato: [Link](<nombreDB>)
• Obtiene un objeto haciendo referencia a la base de datos
especificada en el string <nombreBD>.
• A partir del objeto obtenido, se puede acceder a sus
colecciones y métodos del mismo modo que con el objeto
db (por ejemplo,
[Link](<nombreDB>).<coleccion>
Sentencias de bases de datos: help y hostInfo

• Para help
– Formato: [Link]()
– Permite obtener la lista de métodos que pueden ser llamados
desde la base de datos actual.
• Para hostInfo:
– Formato: [Link]()
– Permite obtener la información, en formato JSON, del sistema
operativo del host en el que se está ejecutando el servidor de
MongoDB.
Sentencias de bases de datos: listCommands y
serverStatus
• Para listCommands:
– Formato: [Link]()
– Obtiene una lista de todos los comandos que pueden ser
ejecutados mediante el método runCommand o
adminCommand.
• Para serverStatus:
– Formato: [Link]()
– Obtiene un objeto JSON con el status actual del servidor.
Sentencias de bases de datos: shutdownServer

• Formato: [Link](“admin”).shutdownServer(<force>,
<secs>)
• Apaga de manera limpia el servidor de base de datos.
• El parámetro force debe ser booleano para indicar si se
fuerza el apagado
• El parámetro <secs> es la cantidad máxima de segundos
que cada operación tiene para terminarse antes del
apagado del servidor.
Sentencias de bases de datos: stats y version

• Para stats
– Formato: [Link](<escala>)
– Permite obtener estadísticos de uso de la base de datos en el
factor de <escala> especificado
– La escala debe ser un número indicando el factor de escalado
en bytes.
• Para version
– Formato: [Link]()
– Permite obtener la versión actual del servidor de base de datos.
Sentencias de bases de datos: auth
• Formato:
– [Link](<user>, <pass>)
– [Link](<obj>)
• Permite a un usuario autentificarse a la base de datos actual.
• Si se envió un nombre de usuario <user> y contraseña <pass> como
parámetros, <pass> se puede omitir. Si eso ocurre, Mongo obligará al
usuario a ingresar la contraseña mediante la consola del sistema operativo.
• Si se desea enviar un objeto como parámetro, éste debe contener las
siguientes claves:
– user: El nombre de usuario
– pwd: Puede ser la contraseña del usuario o una llamada a la función
passwordPrompt() para forzar la solicitud de la contraseña por consola
Sentencias de bases de datos: auth
• Si se desea enviar un objeto como parámetro, éste debe
contener las siguientes claves (cont):
– mechamism: Especifica el mecanismo de autentificación. Debe ser
un string con uno de los siguientes valores :
• SCRAM-SHA-1: SCRAM es la sigla para “Salted Challenge Response
Authentication Mecanism” (Mecanismo de autentificación de respuesta a
desafío salado). Este valor corresponde al uso de SCRAM mediante el
algoritmo SHA-1, mecanismo definido en el RFC 5802.
• SCRAM-SHA-250: Uso de SCRAM mediante el algoritmo SHA-256.
Mecanismo definido en el RFC 7677. Si mechanism se omite, primero se
intenta usar este mecanismo y si falla, se reintentará con SCRAM-SHA-1
• MONGODB-X509: Certificado digital reconocido por MongoDB
Sentencias de bases de datos: auth
• Si se desea enviar un objeto como parámetro, éste debe contener
las siguientes claves (cont):
– mechamism: Especifica el mecanismo de autentificación. Debe ser un
string con uno de los siguientes valores (cont):
• GSSAPI: Autentificación externa usando Kerberos (solo MongoDB Enterprise).
Mecanismo definido en el RFC 4752
• PLAIN: Autentificación externa usando LDAP (solo MongoDB Enterprise)
• MONGODB-OIDC: Autentificación externa usando OIDC (solo MongoDB
Enterprise)
– digestPassword: Opcional booleano. Si su valor es true, se indica que
la contraseña debe pasar por un pre-hash. Si se omite, se asume false.
Su valor solo puede ser true si el valor de mechanism es SCRAM-
SHA-1.
Sentencias de bases de datos: changeUserPassword

• Formato: [Link](<user>, <pass>)


• Permite cambiar la contraseña del usuario <user> por
una nueva <pass>.
• El valor de pass puede ser una llamada a la función
passwordPrompt() para forzar el ingreso de la nueva
contraseña desde consola.
Sentencias de bases de datos: createUser
• Formato: [Link](<user>)
• Permite crear un nuevo usuario.
• El valor de <user> debe ser un objeto BSON con la
siguiente información:
– user: El nombre de usuario
– pwd: La contraseña para el nuevo usuario o bien la llamada a la
función passwordPrompt() para forzar la solicitud de la
contraseña por consola
– customData: Opcional. Debe ser un objeto BSON con información
arbitraria adicional para el usuario.
Sentencias de bases de datos: createUser
• El valor de <user> debe ser un objeto BSON con la siguiente
información (cont):
– roles: Un arreglo que puede estar vacío y/o que puede contener
Strings y/o objetos, para determinar los roles que tendrá el usuario.
Los roles determinarán qué permisos tendrá el usuario en una base de
datos. Cada elemento string indica un rol que tendrá el usuario en la
base de datos actual. Cada elemento objeto debe contener lo
siguiente:
• role: Un String conteniendo el rol deseado. Puede ser uno definido por MongoDB
o uno arbitrario definido por el usuario
• db: Un string con el nombre de la base de datos sobre la cual el usuario tendrá
privilegios dependiendo del rol.
Sentencias de bases de datos: createUser
• El valor de <user> debe ser un objeto BSON con la
siguiente información (cont):
– authenticationRestrictions: Opcional. Un arreglo de objetos para
restringir desde y hasta qué dirección el usuario puede
conectarse. Cada elemento debe contener exactamente los
siguientes dos campos:
• clientSource: Un arreglo de Strings conteniendo direcciones IP o
rangos CIDR (“Classless Inter Domain Routing”) desde donde el
usuario se puede conectar a la base de datos
• serverAddress: Un arreglo de Strings conteniendo direcciones IP o
rangos CIDR hasta donde el usuario se puede conectar.
Sentencias de bases de datos: createUser
• El valor de <user> debe ser un objeto BSON con la siguiente
información (cont):
– mechanisms: Opcional. Debe ser un arreglo de Strings indicando el o los
mecanismos de autentificación que el usuario utilizará. Solo se admiten
los mecanismos SCRAM-SHA-1 y/o SCRAM-SHA-256. Si este campo se
omite, se asume el uso de ambos mecanismos.
– passwordDigestor: Opcional. Debe ser un String para indicar quién debe
encriptar la contraseña. Solo puede ser uno de los siguientes valores:
• server: El servidor encripta la contraseña antes de procesarla. Si passwordDigestor
se omite, se asume este valor
• client: El cliente encripta la contraseña antes de enviarla al servidor. Si se utiliza este
valor, el campo mechanisms no puede contener el elemento SCRAM-SHA-256.
Sentencias de bases de datos: createUser
• El valor de <user> debe ser un objeto BSON con la siguiente
información (cont):
– mechanisms: Opcional. Debe ser un arreglo de Strings indicando el o los
mecanismos de autentificación que el usuario utilizará. Solo se admiten
los mecanismos SCRAM-SHA-1 y/o SCRAM-SHA-256. Si este campo se
omite, se asume el uso de ambos mecanismos.
– passwordDigestor: Opcional. Debe ser un String para indicar quién debe
encriptar la contraseña. Solo puede ser uno de los siguientes valores:
• server: El servidor encripta la contraseña antes de procesarla. Si passwordDigestor
se omite, se asume este valor
• client: El cliente encripta la contraseña antes de enviarla al servidor. Si se utiliza este
valor, el campo mechanisms no puede contener el elemento SCRAM-SHA-256.
Sentencias de bases de datos: createUser: Roles
definidos por MongoDB
• atlasAdmin: Usuario administrador de Atlas. Tiene, entre
otros, permisos para leer, administrar y escribir en
cualquier base de datos y ver la información de cualquier
usuario.
• readWriteAnyDatabase: Pemiso para leer y escribir en
cualquier base de datos
• readAnyDatabase: Permiso para leer cualquier base de
datos.
Sentencias de bases de datos: createUser: Roles
definidos por MongoDB
• read: Rol otorgado por defecto. Permite leer datos de cualquier
colección que no sea de sistema en una base de datos específica.
Incluye permisos para obtener estadísticos de una base de datos,
buscar datos con find, matar procesos de cursores y obtener
listas de colecciones.
• readWrite: Rol otorgado por defecto. Además de los permisos
otorgados por read, también permite convertir una colección
normal a una “capped”, crear o eliminar colecciones, insertar,
eliminar o actualizar datos y renombrar colecciones de manera tal
que la base de datos origen y destino sean la misma.
Sentencias de bases de datos: createUser: Roles
definidos por MongoDB
• dbAdmin: Administrador de una base de datos específica. Tiene los
siguientes permisos sobre colecciones que no sean de sistema:
ignorar o forzar validación al insertar/actualizar, modificar colecciones
o vistas y todos los permisos del rol readWrite excepto buscar datos
con find.
• userAdmin: Administrador de usuarios de una base de datos específica.
Tiene los siguientes permisos: crear, ver o eliminar usuarios y roles,
cambiar contraseñas, otorgar y quitar roles y fijar restricciones de
autentificación
• dbOwner: Propietario de una base de datos especificada. Este rol
equivale a los roles readWrite, dbAdmin y userAdmin.
Sentencias de bases de datos: createUser: Roles
definidos por MongoDB
• backup: Proporciona permisos mínimos para hacer respaldo de datos.
• restore: Proporciona permisos mínimos para restaurar bases de datos
desde un respaldo.
• userAdminAnyDatabase: Administrador de usuarios de todas las bases
de datos excepto local y config.
• dbAdminAnyDatabase: Administrador de todas las bases de datos.
Puede también listar bases de datos.
• root: Superusuario. Este rol equivale a readWriteAnyDatabase,
userAdminAnyDatabase, dbAdminAnyDatabase, restore, backup y
clusterAdmin. Además, también tiene permiso para validar nuevos
datos.
Sentencias de bases de datos: ejemplo de createUser

• Suponga usted que existe una base de datos llamada products.


• Ejecute use products para hacer que esta sea la base de datos
actual
• Luego, crea un nuevo usuario llamado accountUser, cuya
contraseña debe ser ingresada por consola. El usuario debe tener
roles readWrite y dbAdmin
Sentencias de bases de datos: dropUser y dropAllUsers

• Para dropUser:
– Formato: [Link](<username>)
– Permite eliminar un usuario, especificado por su <username>,
de la base de datos actual.
• Para dropAllUsers
– Formato: [Link]()
– Elimina todos los usuarios de la base de datos actual.
Sentencias de bases de datos: getUser
• Formato: [Link](<username>, <opts>)
• Permite obtener la información de un usuario <username> en la base de
datos actual.
• El parámetro <opts> es opcional. Su valor debe ser un objeto BSON que
puede contener lo siguiente:
– showCredentials: Si su valor es true, se muestra también el hash de la contraseña.
Si se omite, se asume false
– showCustomData: Si su valor es true, se muestra también la información
personalizada del usuario. Si se omite, su valor es true
– showPrivileges: Si su valor es true, muestra la lista completa de todos sus privilegios,
incluyendo información expandida para roles heredados. Si se omite, se asume false
– showAuthenticationRestrictions: Si su valor es true, muestra todas las restricciones
de autentificación. Si se omite, se asume false.
Sentencias de bases de datos: getUser
• El valor obtenido es un objeto JSON con la siguiente
información:
– _id: Nombre de usuario en formato “<bd>.<username>”
– userId: Un objeto UUID con la uuid del usuario
– user: Nombre simple del usuario
– database: Nombre de la base de datos
– roles: Un arreglo de Strings y/u objetos con los roles asociados
al usuario. Puede estar vacío
– mechanisms: Un arreglo de Strings con los mecanismos de
autentificación utilizados por el usuario
Sentencias de bases de datos: getUser
• El valor obtenido es un objeto JSON con la siguiente
información (cont):
– customData: Datos personalizados del usuario, solo si
showCustomData es true
– password: Contraseña encriptada, solo si showPassword es
true.
– privileges: Lista de privilegios, solo si showPrivileges es true.
– authenticationRestrictions: Restricciones de autentificación,
solo si showAuthenticationRestrictions es true
Sentencias de bases de datos: ejemplo de getUser

Suponga usted que se creó el usuario


accountAdmin01 en la base de datos products
de la forma que se muestra a la derecha

Ejecutar el método getUser en la base de


datos products para obtener la información por
defecto del usuario accountAdmin01 sin sus
datos personalizados.

Salida de ejemplo
Collation
• Las explicaciones y ejemplos de los métodos de bases
de datos, cursores y colecciones asumen que se utiliza
una “collation” (regla de lenguaje) por defecto.
• Si usted chequea la documentación oficial de MongoDB,
verá que algunos métodos, principalemte aquellos
usados para crear o actualizar, requieren un campo
collation.
Collation
• El valor del campo collation en todos los métodos que lo
requieren siempre será un objeto BSON.
• El objeto BSON requerido para el campo collation admite los
siguientes campos:
– locale: Obligatorio. El locale (idioma) reconocido por ICU (International
Components for Unicode). Debe ser un String cuyo valor posible es
cualquiera de la columna Locale o Variants en la tabla ubicada en
[Link]
defaults/#std-label-collation-languages-locales o “simple” para indicar
simple comparación binaria. Si no se especifica un collation, se asume
un collation con locale “simple” y todos los demás campos con sus
valores por defecto.
Collation
• El objeto BSON requerido para el campo collation admite los
siguientes campos (cont):
– strength: Opcional. El nivel de comparación a realizar. Debe ser uno de los
siguientes números:
• 1: Nivel primario. Se comparan caracteres base ignorando la presencia de acentos y sin
diferenciar entre mayúsculas y minúsculas.
• 2: Nivel secundario. Primero se comparan caracteres base y después se comparan
caracteres iguales que tengan o no tengan acentos.
• 3: Nivel terciario. Primero se comparan caracteres base, luego se compara la presencia
de acentos y luego se diferencia entre mayúsculas y minúsculas. Si strength se omite,
este es el valor por defecto.
• 4: Nivel cuaternario. Úsese solo para procesar texto en japonés o para validar presencia
de puntuaciones
• 5: Nivel idéntico. Limitado para uso específico de un rompe empates.
Collation
• El objeto BSON requerido para el campo collation admite los
siguientes campos (cont):
– caseLevel: Opcional. Aplicable solo si el valor de strength es 1 o 2 para
indicar si también se debe diferenciar entre mayúsculas y minúsculas. Si se
omite, se asume false (no diferenciar)
– caseFirst: Opcional. Permite determinar, en caso de que se tenga que
diferenciar entre mayúsculas y minúsculas al ordenar resultados, qué
caracteres toman precedencia. Debe ser un String con uno de los siguientes
valores:
• “upper”: Mayúsculas antes que minúsculas
• “lower”: Minúsculas antes que mayúsculas
• “off”: Similar a lower con pequeñas diferencias. Si caseFirst se omite, se asume este valor.
Collation
• El objeto BSON requerido para el campo collation admite los
siguientes campos (cont):
– numericOrdering: Opcional. Permite determinar, al momento de ordenar
resultados de búsqueda, cómo tratar los Strings que contienen solo
números. Si su valor es true, obliga a tratar los Strings numéricos como
números. Si se omite, se asume false.
– alternate: Opcional. Permite determinar si caracteres de puntuación y
espacios en blanco se consideran caracteres base. Su valor debe ser un
String con uno de los siguientes valores:
• “non-ignorable”: Tratar puntuaciones y espacios como caracteres base.
• “shifted”: No tratar puntuaciones y espacios como caracteres base, por lo que no
serán considerados a menos que el valor de strength sea 4 o 5.
Collation
• El objeto BSON requerido para el campo collation admite los
siguientes campos (cont):
– maxVariable: Opcional. Se aplica solo si el valor de alternate es
“shifted” para indicar qué caracteres se consideran caracteres
base. Admite uno de los siguientes valores:
• “punct”: Las puntuaciones y espacios en blanco no se consideran
caracteres base. Si maxVariable se ignora, se asume este valor.
• “space”: Solo las puntuaciones se consideran caracteres base.
– backwards: Opcional. Si se comparan strings con acentos y el
valor de este campo es true, se compara alfabéticamente en
orden invertido. Si se omite, se asume false
Collation
• El objeto BSON requerido para el campo collation admite
los siguientes campos (cont):
– normalization: Opcional. Booleano. Si su valor es true, se
chequea si los strings están normalizados y si alguno no lo está,
normalizarlo. Si se omite, se asume false. La mayoría de los
textos no requieren normalizacion.
Validación
• Al momento de crear una colección, MongoDB permite
especificar la forma en que uno valide los valores nuevos
que se ingresan en la colección al insertar o actualizar.
Para ello, los métodos create y createCollection del
objeto db cuentan con un campo opcional llamado
validator.
Validación
• El valor de validator debe ser un objeto BSON que permite especificar
de qué manera se hace la validación.
• El objeto debe tener un único campo con clave igual a un tipo de
validación reconocido por MongoDB, anteponiéndole el $ y su valor
debe ser otro objeto cuya composición depende del tipo de validación
especificado.
• Existen dos formas de agregar un validador a una colección:
– Usando el método [Link](...) con el comando create (ver ejemplo de
$jsonSchema) para agregar un validador a una nueva colección.
– Usando el método [Link](...) con el comando collMod para agregar un
validador nuevo a una colección ya existente o modificar un validador existente
de una colección.
Tipos de validación reconocidos: Validación con
operadores de consultas
• Permite utilizar operadores reconocidos por el parámetro
query del método find para validar que el nuevo valor
ingresado cumpla con las restricciones especificadas por
el operador y su valor
• Este tipo de validación posee las siguientes restricciones:
– No se puede usar el operador $expr con funciones
– No se puede usar los operadores $text y $where
– No se puede usar este tipo de validación en bases de datos
admin, local y config ni en colecciones de sistemas.
Tipos de validación reconocidos: $jsonSchema
• Permite implementar una validación mediante un schema
JSON de manera tal que satisfaga la especificación del
borrador 4 del JSON Schema Standard
([Link]
• Este tipo de validación es más elaborado que los demás tipos.
• El valor para $jsonSchema se considera un esquema que
deben seguir los nuevos valores de un campo.
• No es necesario (y de hecho no está permitido) especificar el
$schema y el $id en el objeto de esquema.
Tipos de validación reconocidos: $jsonSchema

• El valor para $jsonSchema debe ser un objeto


conteniendo los siguientes campos:
– required: Su valor debe ser un arreglo de Strings conteniendo
los campos de la colección que usted desee que sean
obligatorios
Tipos de validación reconocidos: $jsonSchema
• El valor para $jsonSchema debe ser un objeto conteniendo los siguientes
campos:
– properties: Su valor debe ser un objeto conteniendo un campo por cada campo de la
colección que usted desee validar.
• La clave de cada campo en properties debe ser la clave de un campo en la colección que
usted va a crear o alterar.
• El valor de cada campo en properties debe ser un objeto BSON conteniendo, como mínimo, un
campo llamado bsonType, cuyo valor debe ser un String representando el tipo de dato
reconocido por BSON, que puede ser uno de los siguientes: array (arreglo), bool (booleano),
mixed (cualquier tipo que no sea un objeto, arreglo o similar), number (cualquier tipo numérico),
int (entero), long (entero largo), double (decimal de doble presición), decimal, object (objeto),
objectId, string, uuid, binData (datos binarios)
• El campo bsonType puede ser sustituido por el campo jsonType para especificar un tipo de
dato admitido por JSON, a menos que se desee que el campo sea de tipo entero, en cuyo
caso, es obligatorio usar bsonType con el valor “int” o “long”.
Tipos de validación reconocidos: $jsonSchema
• El valor para $jsonSchema debe ser un objeto conteniendo los
siguientes campos:
– properties: Su valor debe ser un objeto conteniendo un campo por
cada campo de la colección al que usted desee especificarle sus
propiedades.
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto asignado
a un campo en properties, ese objeto también puede tener los siguientes campos
dependiendo del valor de bsonType:
– enum: Válido para todos los tipos de dato, incluyendo tipos JSON. Su valor debe ser un
arreglo conteniendo todos los valores posibles que puede tener el campo.
– title: Válido para todos los tipos de dato, incluyendo tipos JSON. Nombre corto para el
campo, usado solo para propósitos de metadatos
– description: Válido para todos los tipos de dato, incluyendo tipos JSON. Descripción
detallada de para qué sirve el campo
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto asignado
a un campo en properties, ese objeto también puede tener los siguientes campos
dependiendo del valor de bsonType:
– items: Válido para bsonType: “array”. Debe ser un objeto u arreglo de objetos donde cada
uno debe contener las propiedades que debe tener el ítem i-esimo del mismo modo que
con cada campo en properties. Si se omite, se asume que se permite agregar cualquier
elemento.
– additionalItems: Válido para bsonType: “array”. Debe ser un booleano o un arreglo de
objetos
» Si es un booleano, su valor debe ser true para permitir que se agreguen más
elementos al arreglo sin aplicarles validación, o false para prohibir que se agreguen
elementos adicionales.
» Si es un objeto, debe contener las propiedades que deben tener todos los elementos
adicionales que se agreguen al arreglo del mismo modo que con cada campo en
properties.
» Si se omite este campo, se asume true
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto
asignado a un campo en properties, ese objeto también puede tener los
siguientes campos dependiendo del valor de bsonType:
– maxItems: Válido para bsonType: “array”. Su valor debe ser un número positivo para
indicar la cantidad máxima de elementos que puede tener el arreglo. Si se omite, se
asume que no hay límite máximo.
– minItems: Válido para bsonType: “array”. Su valor debe ser un número positivo para
indicar la cantidad mínima de elementos que puede tener el arreglo. Si se omite, se
asume que el arreglo puede tener un mínimo de 0 elementos.
– uniqueItems: Válido para bsonType: “array”. Su valor debe ser true para indicar que
no se permiten elementos repetidos o false en caso contrario. Si se omite, se asume
false.
– multipleOf: Válido para tipos de datos numéricos. Su valor debe ser un número entero
para indicar que el nuevo valor debe ser un múltplo de ese número. Si se omite, se
asume un 1.
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto asignado a un
campo en properties, ese objeto también puede tener los siguientes campos
dependiendo del valor de bsonType:
– maximum: Válido para tipos de datos numéricos. Su valor debe ser un número para indicar que
el nuevo valor no debe ser mayor a ese número. Si se omite, se asume que no hay límite
máximo.
– exclusiveMaximum: Válido para tipos de datos numéricos. Aplicable solo si el campo maximum
está presente. Su valor debe ser true para indicar que el nuevo valor debe ser estrictamente
menor que el valor de maximum o false para indicar que debe ser menor o igual. Si se omite, se
asume false
– minimum: Válido para tipos de datos numéricos. Su valor debe ser un número para indicar que
el nuevo valor no debe ser menor a ese número. Si se omite, se asume que no hay límite
mínimo.
– exclusiveMinimum: Válido para tipos de datos numéricos. Aplicable solo si el campo minimum
está presente. Su valor debe ser true para indicar que el nuevo valor debe ser estrictamente
mayor que el valor de minimum o false para indicar que debe ser mayor o igual. Si se omite, se
asume false
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto
asignado a un campo en properties, ese objeto también puede tener
los siguientes campos dependiendo del valor de bsonType:
– required: Válido para bsonType:”object”. Igual que el campo required de
$jsonSchema, pero para documentos embebidos asignados al campo de la
colección. Si se omite, se asume que todos los campos son opcionales.
– properties: Válido para bsonType:”object”. Igual que el campo properties de
$jsonSchema, pero para documentos embebidos asignados al campo de la
colección. Si se omite, se asume que se los campos que se agregan al objeto
pueden ser de cualquier tipo.
– minProperties: Válido para bsonType:”object”. Debe ser un número entero
positivo para indicar la cantidad mínima de campos que debe tener el objeto. Si
se omite, se asume que se permiten objetos vacíos.
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto
asignado a un campo en properties, ese objeto también puede tener los
siguientes campos dependiendo del valor de bsonType:
– maxProperties: Válido para bsonType:”object”. Debe ser un número entero positivo
para indicar la cantidad máxima de campos que debe tener el objeto. Si se omite, se
asume que no hay límite máximo de campos.
– additionalProperties: Válido para bsonType:”object”. Puede tener 3 valores posibles:
» true: Este objeto puede tener campos adicionales además de las especificadas
en el campo required y no se requiere validación para ninguno. Este es el valor
por defecto.
» false: Este objeto no puede tener campos adicionales
» <objeto>: Este objeto peude tener campos adicionales y todos ellos deben
cumplir con la validación especificada en <objeto> del mismo modo que en el
valor de $jsonSchema
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto
asignado a un campo en properties, ese objeto también puede tener los
siguientes campos dependiendo del valor de bsonType:
– dependencies: Válido para bsonType:”object”. Especifica de qué campos y esquema
depende este objeto. Si se omite, se asume que el objeto no tiene dependencias.
– maxLength: Válido para bsonType:”string”. Su valor debe ser un número entero
positivo para indicar el largo máximo que debe tener el string. Si se omite, se asume
que no hay límite máximo
– minLength: Válido para bsonType:”string”. Su valor debe ser un número entero
positivo para indicar el largo mínimo que debe tener el string. Si se omite, se asume
que no hay límite mínimo
– pattern: Válido para bsonType:”string”. Su valor debe ser un string conteniendo una
expresión regular para indicar el formato que deben tener los nuevos Strings. Si se
omite, se asume que puede ser cualquier String.
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto
asignado a un campo en properties, ese objeto también puede tener
los siguientes campos dependiendo del valor de bsonType:
– anyOf: Opcional. Válido para todos los tipos de dato. Su valor debe ser un
arreglo de objetos de esquema para indicar que el nuevo valor debe cumplir con
lo estipulado en al menos uno de los elementos del arreglo.
– allOf: Opcional. Válido para todos los tipos de dato. Su valor debe ser un arreglo
de objetos de esquema para indicar que el nuevo valor debe cumplir con lo
estipulado en todos los elementos del arreglo
– enum: Válido para todos los tipos de dato. Su valor debe ser un arreglo
conteniendo todos los valores posibles que puede tener el campo. Si se omite, se
asume que se acepta cualquer valor del tipo especificado en bsonType
Tipos de validación reconocidos: $jsonSchema
• Si se incluyó el campo bsonType en vez de jsonType dentro del objeto
asignado a un campo en properties, ese objeto también puede tener
los siguientes campos dependiendo del valor de bsonType:
– not: Opcional. Válido para todos los tipos de dato. Su valor debe ser un objeto de
esquema para indicar que los nuevos valores del campo no deben cumplir con
ese esquema.
– oneOf: Opcional. Válido para todos los tipos de dato. Su valor debe ser un
arreglo de objetos de esquema para indicar que el nuevo valor debe cumplir con
uno y solo uno de los elementos del arreglo
– enum: Válido para todos los tipos de dato. Su valor debe ser un arreglo
conteniendo todos los valores posibles que puede tener el campo. Si se omite, se
asume que se acepta cualquer valor del tipo especificado en bsonType
Tipos de validación reconocidos: Ejemplo de
$jsonSchema (pt. 1)
• Crear una colección llamada person con el método create
del objeto db y agregarle una validación mediante un
schema BSON de manera tal que:
– Cada campo tenga una descripción dentro del objeto de
esquema
– Todos los campos son opcionales
– El campo _id debe ser un número
– Cada documento debe tener un campo name de tipo string
– Cada documento debe tener un campo age de tipo numérico
Tipos de validación reconocidos: Ejemplo de
$jsonSchema (pt. 2)
• Crear una colección llamada person con el comando
create del método runCommand del objeto db y agregarle
una validación mediante un schema BSON de manera tal
que (cont.):
– Cada documento debe tener un campo llamado hobbies. Este
campo debe ser un documento embebido que debe cumplir
con lo siguiente:
• Debe tener un campo llamado indoor de tipo arreglo de strings.
• Debe tener un campo llamado outdoor de tipo arreglo de strings
Tipos de validación reconocidos: Ejemplo de
$jsonSchema (pt. 3)
Índices
• Al igual que en SQL, MongoDB permite trabajar con índices.
• Un índice en MongoDB es una estructura especial de datos
que guarda una pequeña porción de éstos.
• Los índices son generados ordenadamente y son fáciles de
buscar eficientemente.
• Un índice apunta al identificador de un documento.
• Por defecto, todas las colecciones poseen un único índice,
que corresponde al campo _id.
Con Índices...
• Se mejora el desempeño de una consulta:
• Incrementa la rapidez de la ejecución de la consulta
• Reduce interacciones de entrada/salida con el disco
• Reduce los recursos requeridos para ejecutar la consulta.
• Solo se obtienen los documentos identificados por el índice
basado en la consulta.
• Los índices también soportan comparaciones de igualdad,
operaciones basadas en rangos y obtención de
resultados ordenados.
Sin Índices...
• Al ejecutar una consulta, MongoDB ejecuta un escaneo
de colección, es decir, lee TODOS los documentos en la
colección buscando aquellos que satisfagan el filtro
especificado (de haber uno) en la consulta.
• Se ordena los resultados de la consulta en memoria.
Limitaciones de los índices
• Cada vez que se inserta o actualiza un documento en
una colección, es necesario actualizar la estructura de
dato del índice.
• Mientras más índices se generen, mayor será el riesgo
de la existencia de índices innecesarios o redundantes.
Tipos sencillos de índices
• Índice sobre un campo simple: Son utilizados para ordenar
por un único campo
• Índices compuestos: Son utilizados para ordenar por dos o
más campos.
• Índices de múltiples claves (multikey): Permiten recolectar y
ordenar elementos de campos que son de tipo arreglo.
• No soportados para uso con el operador $expr.
• Índices de texto: Permiten consultas de búsqueda de texto en
campos de tipo String.
Tipos sencillos de índices
• Índice sobre un campo simple: Son utilizados para ordenar por un único campo
• Índices compuestos: Son utilizados para ordenar por dos o más campos simples.
• Un índice compuesto puede tener un máximo de un campo de tipo arreglo.
• El orden de los campos SÍ altera el desempeño del índice. Se recomienda primero definir los campos usados
para comparaciones de igualdad, luego los usados para ordenamiento y finalmente los usados para definir
rangos.
• Índices de múltiples claves (multikey): Permiten recolectar y ordenar elementos de
campos que son de tipo arreglo.
• No soportados para uso con el operador $expr.
• Un índice compuesto en el que exactamente uno de los campos es un arreglo en la colección se
considera un índice multikey.
• Se permite exactamente un campo de tipo arreglo en un índice multikey.
• Índices de texto: Permiten consultas de búsqueda de texto en campos de tipo String.
• Solo se permite hasta un índice de texto por colección.
Tipos sencillos de índices
• Índice único: Es un índice de cualquiera de los tipos anteriores creado de tal
manera que la colección no acepte inserciones o modificaciones de documentos
donde el valor de un campo(s) usado(s) como índice(s) concuerde(n) con un valor
existente en el índice
• Índice parcial: Es un índice de cualquiera de los tipos listados en la diapositiva
anterior que solo aceptará modificaciones o insersiones de documentos si éstos
cumplen con un filtro especificado (véase el método createIndex para más detalles).
• Índice escaso (sparse): Es un índice de cualquiera de los tipos listados en la
diapositiva anterior que solo aceptará modificaciones o insersiones de documentos
que contengan cualquiera de los campos especificados en ese índice, incluso si su
valor es null.
• NOTA: Los índices de texto se consideran índices sparse por defecto.
Tipos sencillos de índices
• Índice oculto: Es un índice de cualquiera de los tipos
anteriores creado de tal manera que no pueda ser usado
para soportar una consulta.
• Útil para probar qué sucedería con el desempeño de una
consulta si se elimina un índice sin eliminarlo realmente.
¿Cómo crear un índice?
• Existen las siguientes formas de crear un índice para una
colección:
• El método createIndex de cualquier colección
• El método createIndexes de cualquier colección
• El método runCommand de la base de datos con el comando
createIndexes
El método createIndex
• Formato: db.<coleccion>.createIndex(keys, opts, commitQuorum)
• Este método permite crear un único índice para una colección.
• El valor de keys depende del tipo de índice que se desea crear, pero siempre es un objeto BSON:
• Índice sobre un campo simple: El contenido es un único campo con clave igual a la clave de cualquier campo en la
colección y un 1 para indicar que al momento de buscar, se ordenarán los resultados ascendentemente por ese
campo en la colección o un -1 para orden descendente.
• Índice compuesto: El contenido es dos o más campos definidos cada uno del mismo modo que en un índice sobre un
campo simple
• Índices de múltiples claves: Igual que un índice compuesto, pero las claves deben ser campos de un documento
embebido en un arreglo de documentos (“campo_documento.campo_subdocumento”)
• También se puede crear el índice sobre un arreglo como si fuera un campo simple. El resultado es un índice sobre todos los
elementos del arreglo.
• Índice de texto: Igual que un índice sobre un campo simple o uno compuesto, pero los valores para todas las claves
deben ser Strings en lugar de un 1 o un cero.
• Para aquellos campos en la colección cuyo valor es un documento embebido, se puede crear un
índice con clave “<campo>.$**” para aplicar el índice a todos los campos del documento embebido.
• Si la clave a utilizar en el índice es $**, se admitirán todos los campos de la colección.
El método createIndex
• El valor de opts debe ser un objeto BSON que puede estar
vacío o contener al menos uno de los siguientes campos
opcionales:
• unique: Campo booleano. Si su valor es true, el índice será
tratado como único.
• Si se omite, su valor es false.
• name: String con el nombre de la colección.
• Si se omite, se asume que el nombre del índice será el resultado de
concatenar el nombre del (de los) campo(s) incluido(s) en el índice y el
número para indicar la orientación del ordenamiento.
El método createIndex
• El valor de opts debe ser un objeto BSON que puede estar vacío o
contener al menos uno de los siguientes campos opcionales (cont.):
• partialFilterExpression: Un objeto BSON. Si se especifica, se asume que
el índice es parcial. El contenido de objeto recibido debe contener uno o
varios campos que cumpla con exactamente una de las siguientes
condiciones
• La clave debe ser la clave de cualquier campo en la colección y su valor debe ser un
valor cualquiera del tipo de dato admitido por el campo, para indicar que solo se
aceptarán documentos en los que el valor del campo “clave” es igual a “valor”
• La clave debe ser un operador válido de comparación y su valor debe ser de un tipo
apropiado dependiendo de la clave:
• Se admite cualquiera de las siguientes claves: $eq, $ne, $exists: true, $gt, $gte, $lt, $lte, $type,
$and, $or, $in
El método createIndex
• El valor de opts debe ser un objeto BSON que puede estar
vacío o contener al menos uno de los siguientes campos
opcionales (cont.):
• sparse: Booleano. Si su valor es true, el índice se considera sparse.
• NOTA: Si el índice es de texto, no es necesario incluir este campo.
• Si se omite, se asume false a menos que suceda lo especificado en la nota.
• expireAfterSeconds: Número entero para indicar que el índice expirará
después de la cantidad de segundos especificada.
• Si el valor es cero o si se omite, se asume que no hay límite de tiempo.
• El valor debe ser un número comprendido entre cero y (231 - 1), ambos
inclusive
El método createIndex
• El valor de opts debe ser un objeto BSON que puede estar vacío o contener
al menos uno de los siguientes campos opcionales (cont.):
• hidden: Booleano. Si su valor es true, el índice será considerado oculto
• Si se omite, se asume false.
• collation: Documento. Establece opciones de collation para el índice (véase
Collation)
• NOTA: Los índices de texto NO soportan collation.
• weights: Documento. Debe tener una cantidad de campos entre 1 y la cantidad de
campos en keys. La clave para cada campo debe existir en keys, sin repetir las
claves. El valor para cada clave debe ser un número comprendido entre 1 y (104 - 1)
para indicar la significancia de un campo con respecto a otros en términos de score.
• Si no se especifica el score para un campo, se asume score 1
• A partir de la versión 5 de MongoDB, solo los índices de texto soportan esta opción.
El método createIndex
• El valor de opts debe ser un objeto BSON que puede estar vacío o contener
al menos uno de los siguientes campos opcionales (cont.):
• default_language: String. Determina las reglas para destilar y tokenizar y la lista de
“stop words” (diccionario negativo). Debe ser cualquier nombre de lenguaje
(“language name”) definido en
[Link]
text-search-languages
• Si se omite, se asume “english”.
• Aplicable solo para índices de texto
• language_override: String. Nombre del campo en la colección conteniendo el
lenguaje a “sobrescribir”. Su valor debe ser cualquier valor admitido para el campo
anterior
• Si se omite, se asume “language”
• Aplicable solo para índices de texto.
El método createIndex
• El valor de opts debe ser un objeto BSON que puede estar vacío o contener
al menos uno de los siguientes campos opcionales (cont.):
• textIndexVersion: Versión del indexado de texto a utilizar. Su valor debe ser un
número comprendido entre 1 y 3
• Si se omite, se asume la versión asociada a la versión de MongoDB que se está utilizando.
• NOTA: No incluir este campo a menos que sea realmente necesario
• wildcardProjection: Documento. Aplicable para índices sobre campos cuyo valor es
un documento embebido. Debe tener una cantidad de campos entre 1 y el número
de campos de ese documento embebido. La clave de cada campo en esta opción
debe ser la ruta completa al campo del documento embebido en un campo de la
colección que fue designado para el índice y su valor debe ser un 1 para incluir el
campo en el índice o un 0 para excluirlo
• Si no se incluye esta opción, se asume que al usar $** en un campo, el índice se aplicará a
todos los campos del documento embebido.
El método createIndex
• El valor de commitQuorum debe ser un String o un entero indicando el
número mínimo de miembros del set de réplica, incluyendo el primario,
que deben reportar una exitosa construcción del índice antes de que el
miembro primario marque el índice como listo. Se admiten los
siguientes valores:
• “votingMembers”: Todos los miembros portando datos. Se asume este valor si
se omite commitQuorum
• “majority”: La mayoría de los miembros que portan datos
• <numero mayor que cero>: Un número específico de miembros que portan datos
• 0: Deshabilita el quorum
• <tag>: Todos los miembros que tengan el tag especificado.
El método createIndex: Ejemplo
• Desde la base de datos actual, crear un índice para la
colección invoices en la base de datos examples para
ordenar ascendentemente los documentos en ella por el
campo invoices especificando la mayoría como quorum.
El método createIndexes
• Formato: db.<coleccion>.createIndexes(idxs, opts, commitQuorum)
• Se comporta del mismo modo que createIndex, con la diferencia de
que createIndexes permite crear más de un índice.
• El parámetro idxs debe ser un arreglo de objetos donde cada
elemento representa un índice definido del mismo modo que en
createIndex.
• Los parámetros opts y commitQuorum se comportan del mismo
modo que en createIndex y se aplican a todos los índices definidos
en idxs.
El método createIndexes: Ejemplo
• Crear dos índices para una
colección llamada “collection”
usando un campo a para el
primer índice y un campo b para
el segundo, de manera que se
ordene ascendentemente por
ambos campos. El índice debe
ser único, sparse y debe expirar
después de dos horas
El comando createIndexes
• Formato: [Link]({“createIndexes”: “<coll>”, ...})
• Este comando se comporta del mismo modo que el método createIndexes llamado
desde la colección <coll>
• Además de la clave createIndexes, se admiten los siguientes campos:
• indexes: Obligatorio. Su valor es un arreglo de objetos BSON, donde cada uno está
compuesto de los siguientes campos:
• key: Un objeto BSON conteniendo uno o varios campos definidos del mismo modo que el primer
parámetro del método createIndex de una colección
• name: Un string con el nombre del índice
• Cero o más opciones admitidas en el segundo parámetro del método createIndex de una colección
con su correspondiente valor apropiado.
• commitQuorum: Opcional. Definido del mismo modo que el tercer parámetro del método
createIndex de una colección.
• comment: Opcional. Su valor puede ser de cualquier tipo y solo sirve para propósitos de
logging.
El comando createIndexes: ejemplo
• Desde la base de datos actual, ejecutar un comando en la base
de datos examples para crear un índice llamado invoiceIndex
para la colección invoices de esa base de datos usando el
campo invoices, estableciendo como quorum la mayoría.
¿Cómo eliminar un índice?
• Para eliminar un índice desde una colección, se tienen las siguientes alternativas
• Llamar al método dropIndex desde cualquier colección para eliminar un índice y solo uno
de esa colección.
• Llamar al método dropIndexes desde cualquier colección para eliminar uno, varios o
todos los índices de esa colección.
• Llamar al método runCommand de la base de datos con el comando dropIndexes
• Antes de eliminar un índice, asegúrese de que el índice no esté siendo usado en
una consulta. Para chequearlo, ejecute la siguiente sentencia y busque en la salida
todas las ocurrencias de la expresión stage: “IXSCAN”:
db.<coleccion>.explain().find() especificando en el método find los parámetros de la
consulta.
El método dropIndex
• Formato: db.<coleccion>.dropIndex(name)
• Este método permite eliminar de la colección un índice
especificado por su nombre o su contenido
• El valor de name puede ser un String con el nombre del
índice o un objeto BSON con el contenido de éste tal como
se pasó al primer parámetro del método createIndex cuando
se creó.
• NOTA: Para eliminar un índice de texto, el valor de name solo
puede ser un String con el nombre de ese índice.
• No está permitido eliminar el índice _id
El método dropIndexes
• Formato: db.<coleccion>.dropIndex(?)
• Este método permite eliminar de la colección uno, varios o todos los
índices asociados a una colección
• Se tienen los siguientes argumentos posibles para este método:
• Sin argumentos: Se eliminan todos los índices
• NOTA: Llamar a dropIndexes sin argumentos NO elimina el índice _id.
• Un indice especificado por su nombre o el objeto con el que fue creado al
llamar a createIndex
• Un arreglo de índices en el que cada elemento es especificado del mismo
modo que en el punto anterior.
• No está permitido eliminar el índice _id.
El comando dropIndexes
• Formato: [Link]({dropIndexes: “<col>”, index: <?>})
• Este comando opera de manera similar al método dropIndexes
llamado desde la colección col.
• El valor del campo index puede ser:
• El nombre de un índice
• Un objeto BSON utilizado para crear un índice con el comando createIndexes o
el método createIndex
• Un arreglo de objetos BSON utilizado para crear uno o más índices con el
comando createIndexes o el método del mismo nombre
• Un “*” para indicar que se eliminarán todos los índices
• NOTA: Asignar ese valor al campo index NO elimina el índice _id.
• No está permitido eliminar el índice _id.
¿Cómo buscar índices?
• Para buscar todos los índices asociados a una colección, se tiene el comando
getIndexes invocado con el método runCommand de la base de datos y el método
del mismo nombre llamado desde la colección deseada.
• El formato para el método getIndexes es:
db.<coleccion>.getIndexes()
• El formato para el comando getIndexes es:
[Link]({getIndexes: <coleccion>, cursor: {batchSize: <n>}, comment:
<?>})
• El campo cursor es opcional.
• El valor para el campo batchSize debe ser un número indicando el tamaño del batch de
la salida del comando
• El campo comment es opcional y puede tener un valor de cualquier tipo. Usado solo para
logging.
¿Cómo buscar índices?
• La salida del método getIndexes es un arreglo de objetos BSON, donde cada elemento contiene
los siguientes campos:
• v: Número entero, la versión del índice
• key: Un objeto BSON conteniendo uno o más campos. Ese objeto es el mismo pasado como parámetro
a la llamada a createIndex o createIndexes para crear el índice.
• name: Nombre del índice.
• La salida del comando getIndexes es un objeto conteniendo los siguientes campos:
• cursor: Un cursor apuntando a un documento por cada índice asociado a la colección. Cada documento
contiene los siguientes campos:
• id: Un cero si no hay más resultados además de los obtenidos. En caso contrario, su valor es un número entero positivo
• ns: El namespace (<nombre_base_de_datos>.<nombre_coleccion>) asociado a los índices obtenidos
• firstBatch: Un documento conteniendo una cantidad de índices igual al valor del campo batchSize.
• ok: true si el comando fue exitoso, false en caso contrario.
• Si es necesario, se puede obtener más resultados llamando a [Link]({getMore: <valor
de [Link]>, collection: “<base_de_datos>.<coleccion>”, batchSize: <n>})
Ocultar y revelar índices
• Cuando se crea un índice, el programador decide si marcarlo
o no marcarlo como oculto.
• Después de crear el índice, el programador aun puede quitar
o agregar la marca de oculto a ese índice llamando a:
• db.<coleccion>.hideIndex(index)
• db.<coleccion>.unhideIndex(index)
• El parámetro index en cada método debe ser un string con el
nombre del índice o un objeto BSON que fue pasado como
parámetro a createIndex o createIndexes.
Asignar quorum al índice después de crearlo
• Cuando se crea un índice, el programador decide si asignar un quorum o no.
• Después de crear el índice, el programador aun puede asignar un quorum
con el comando setIndexCommitQuorum, que tiene el siguiente formato:
• [Link]({setIndexCommitQuorum: <coleccion>, indexNames: [<indexes>],
commitQuorum: <?>, comment: <?>})
• El arreglo indexes debe contener uno o más nombres de índices
• El campo commitQuorum debe tener un valor aceptado por el parámetro del
mismo nombre de los métodos createIndex y createIndexes
• El campo comment es opcional y puede tener un valor de cualquier tipo.
Usado solo para logging.
PARTE 2: JAVA con
MongoDB
¿Cómo conectarse a un servidor MongoDB?
• Actualmente MongoDB proporciona 5 maneras distintas de conexión al servidor.
– Drivers nativos de MongoDB
– Compass, la GUI de MongoDB
– mongosh, la consola de MongoDB
– Plugin para Visual Studio Code
– AtlasSQL
• Todas ellas requieren de una URL de conexión cuyo formato es:
mongodb+srv://<usuario>:<contraseña>@<host>
• Dependiendo de la URL del host, se puede espeficiar un puerto o no.
• El puerto por defecto utilizado para conexiones a un servidor MongoDB es el 27017
• Dependiendiendo del método de conexión utilizado, se puede incluir un querystring
al final del host. A diferencia de la mayoría de las URLS, que requieren que el query
string comience simplemente con el signo de interrogación (?), MongoDB requiere
que empiece con un slash y luego el signo de interrogación (/?)
Drivers nativos de MongoDB
• Este método de conexión permite utilizar un driver proporcionado por MongoDB
para una aplicación desarrollada en un lenguaje de programación.
• Para cada lenguaje de programación, existe un rango específico de versiones
soportadas del driver.
• Los lenguajes de programación soportados por el driver de MongoDB son: [Link],
C, C++, C#, [Link], Go, JAVA, Kotlin, PHP, Python, Ruby, Rust, Scala, Swift
• Usar un driver requiere que a la URL de conexión se agregue el siguiente
querystring: ?retryWrites=true&w=majority
• Para más detalles acerca de qué y cómo usar los drivers para los lenguajes
mencionados arriba, refiérase a htttp://[Link]/docs/drivers
• Para otros lenguajes que soporten conexiones a bases de datos No-SQL, refiérase
a [Link]
Compass
• Compass es el cliente gráfico oficial proporcionado por
MongoDB para visualizar e interactuar con bases de
datos.
• Siga las instrucciones correspondientes a su sistema
operativo para instalar este programa.
• Luego ingrese la URL, nombre de usuario y contraseña, o
algún otro método de autentificación.
• Una vez autentificado, podrá acceder a todas sus bases
de datos y ejecutar sus sentencias.
mongosh
• MongoDB proporciona el programa mongosh para conectarse a una base de
datos desde la consola de cualquier sistema operativo.
• Este programa debe ser instalado siguiendo los pasos especificados en el
sitio oficial de MongoDB
• Una vez instalado, para conectarse a uan base de datos, se debe ejecutar lo
siguiente:
mongosh “mongodb+srv://<host>” --apiVersion 1 --username
<nombre_usuario>
• Se le pedirá una contraseña. Si la contraseña ingresada es correcta, logrará
conectarse al servidor y acceder, por defecto, a la base de datos test.
• Una vez conectado, usted puede ejecutar instrucciones en lenguaje
JavaScript según la especificación ECMA 6
Errores típicos de conexión a bases de datos MongoDB

• Autentificación fallida
• No hay conectividad entre el cliente y el servidor.
• URL de conexión no reconocida o no permitida
• IP de un cliente no permitida para conexión con el
servidor (es decir, que no fue agregada a la lista de IPs
permitidas vía Security -> Network Access)
• Puerto bloqueado por un firewall o utilizado por otro
proceso.
• Mala configuración de firewall.
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Como con cualquier aplicación JAVA, se puede integrar la
librería JAR con el driver directamente o por medio de
frameworks de manejo de dependencias como Maven o
Gradle.
• Para esta documento, utilizaremos únicamente Maven, por lo
que siga la documentación oficial de Maven para descargar e
instalar el framework, incluir sus ejecutables en la variable de
entorno PATH correspondiente a su sistema operativo e
incluir el framework en una IDE como Eclipse o similar.
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Para incluir la librería de MongoDB en un projecto Maven, asumiendo que usted
está usando una IDE:
– Use la IDE para abrir el archivo [Link]
– Incluya un tag <dependencies> si es que no está presente en el archivo
• Para conformidad con el esquema impuesto por Maven, asegúrese que el tag <dependencies> esté antes
del tag <build> o, si no hay un <build>, antes del cierre del tag <project>
– Dentro del cuerpo del tag <dependencies>, agrege un tag <dependency> con la siguiente
información:
• <groupId>: [Link]
• <artifactId>: mongodb-driver-sync
• <version>: La versión más reciente soportada por el JDK con el que usted va a trabajar. Para este
documento, se utilizará la versión 4.7.1, asumiendo que se va a programar con la versión 8 del JDK
– Opcionalmente, usted puede agregar un tag <properties>, si es que no fue agregado antes,
agregar allí un tag <[Link]> con valor 4.7.1 y luego asignar al tag
<version> del cuerpo del tag <dependency> del paso anterior la expresión ${mongodb-driver-
[Link]}
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Para incluir la librería de MongoDB en un projecto Maven, asumiendo que usted
está usando una IDE (cont):
– Incluyendo la dependencia especificada en la diapositiva anterior permitirá incluir
automáticamente 3 librerías adicionales:
• [Link] 4.7.1: Núcleo del driver para conexiones síncronas y asíncronas
• bson 4.7.1: Manejo de expresiones BSON y JSON
• bson-record-codec 4.7.1: Codec de registros BSON.
– El driver también requiere de la librería slf4j, pero esta no es incluida automáticamente al
importar la dependencia, por lo que es necesario agregar otra. Se puede slf4j
directamente como dependencia a [Link] o agregar la dependencia logback-classic,
que automáticamente incluye la librería de slf4j. Para esto último, el contenido del tag
dependency debe tener lo siguiente:
• groupId: [Link]
• artifactId: logback-classic
• version: 1.2.11
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Luego, se debe obtener la URL de conexión.
• Una vez obtenida, se debe crear un objeto [Link]
usando un constructor de esa clase que admita un parámetro String. Pasar a
ese constructor la URL obtenida, con el host, nombre de usuario y
contraseña correctos.
• Crear un objeto [Link] utilizando el método
estático builder() de la clase [Link]
• Asignar al objeto [Link] creado el valor devuelto por el método
version de ese mismo objeto, pasándole como parámetro la constante
[Link].V1
• Crear un objeto ServerApi asignándole el valor devuelto por el método build()
del objeto [Link] resultante.
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Crear un objeto [Link]
mediante el método estático builder() de la clase
MongoClientSettings.
• Asignar al objeto [Link] creado el valor
devuelto por el método serverApi del mismo objeto, asignándole
como parámetro el objeto ServerApi creado
• Asignar al objeto [Link] resultante del paso
anterior el valor devuelto por el método applyConnectionString del
mismo objeto, asignándole como parámetro el valor del objeto
ConnectionString creado
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Crear un objeto [Link]
mediante el método build() del objeto
[Link] resultante de los pasos
anteriores.
• Crear un objeto [Link]
mediante el método estático create de la clase
[Link], pasándole como
parámetro el objeto MongoClientSettings obtenido.
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA

En el ejemplo, asuma que la contraseña es “???????.”


Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• En caso de éxito, se mostrará un mensaje en el log conteniendo los metadatos de
la conexión en formato JSON.
• Se tienen las siguientes consideraciones:
– Si se trabaja en una aplicación que genera múltiples hebras, asegúrese de que el método
que crea el objeto MongoClient sea “thread-safe”
– Asegúrese de crear un único objeto MongoClient por cada conexión a una base de datos
diferente
– Asegúrese de que el objeto MongoClient sea creado desde una clase creada mediante el
patrón de diseño Singleton, o que el objeto sea creado una única vez en todo el ciclo de
ejecución del programa.
– La clase MongoClient implementa la interfaz [Link], por lo que, a menos
que la versión del JDK lo prohiba y si el objeto MongoClient no fue creado en una clase
singleton, ese objeto sea creado dentro de un try con recursos. Si ese objeto no fue creado
en un try con recursos, debe ser cerrado manualmente llamando al método close() del objeto
MongoClient.
Conexión a una base de datos utilizando el driver de
MongoDB para JAVA
• Se tienen las siguientes consideraciones (cont):
– Asegúrese que la IP del equipo desde donde usted está ejecutando la aplicación
esté en la lista de IPs de clientes autorizados en la base de datos. De lo contrario,
se obtendrá un [Link]
– También se obtendrá una excepción si la URL es incorrecta, el usuario no existe o la
contraseña es incorrecta.
• Por defecto, los usuarios son creados en la base de datos admin. Si el usuario es creado en
una base de datos diferente, MongoDB lo tomará como usuario inexistente a menos que
agregue la clave authSource a la query string de la URL de conexión con valor igual a esa
base de datos.
• Contraseñas con caracteres especiales no codificados se consideran inválidas.
– También se obtendrá una excepción si hay demasiadas conexiones abiertas (la
cantidad depende de si el servidor de base de datos está en modo gratuito o de
paga)
• Se puede limitar la cantidad máxima de conexiones simultáneas agregando la clave
maxPoolSize a la query string de la URL de conexión con un valor numérico arbitrario.
Operaciones CRUD en MongoDB desde JAVA

• Una vez establecida la conexión, usted podrá utilizar el


objeto MongoClient, más las clases proporcionadas por el
API de BSON, para hacer operaciones CRUD (manejo de
colecciones y de documentos)
API BSON para JAVA
Introducción
• La librería BSON es una dependencia requerida por
MongoDB para generar documentos simples o
documentos BSON para ser utilizados en operaciones
CRUD
• Existen clases no solo para representar documentos, sino
también para representar tipos de datos reconocidos por
BSON
La clase ObjectId
• Esta clase, perteneciente al paquete [Link] permite hacer
referencia al tipo de dato ObjectId, que es el tipo de dato por defecto
del campo _id para todos los documentos de todas las colecciones.
• Se puede crear un objeto ObjectId con el constructor por defecto de
la clase o con el método estático get() de la misma clase.
• Esta clase implementa la interfaz [Link]<ObjectId>
para comparar 2 objetos ObjectId por medio del método
compareTo(ObjectId other)
• Esta clase sobrescribe los métodos equals(Object other) y
hashCode() para comparar un objeto ObjectId con otro.
La clase ObjectId
• También posee métodos públicos para convertir un ObjectId a un
tipo de dato válido:
– public [Link] getDate(): obtiene la fecha de creación del objeto en
formato Date
– public int getTimestamp(): obtiene la fecha de creación del objeto en
formato UNIX.
– public byte[ ] toByteArray(): Obtiene un arreglo de bytes con la
codificación del ObjectId
– public String toHexString(): Obtiene la id como un String numérico
hexadecimal
– public String toString(): Sobrescritura del método toString de la clase
Object que hace exactamente lo mismo que toHexString()
La clase ObjectId
• También posee los siguientes métodos estáticos:
– public static ObjectId getSmallestWithDate(Date d): Crea un
nuevo ObjectId para la fecha específica de manera tal que sea
“menor o igual” a otro ObjectId para la misma fecha (hasta los
segundos inclusive) y menor que cualquier otra fecha posterior.
– public static boolean isValid(String hex): Devuelve true si el
número hexadecimal especificado es un ObjectId válido en
BSON.
La clase Document
• Esta clase, perteneciente al paquete [Link], permite
hacer referencia a un simple documento.
• Posee 3 constructores:
– public Document(): Crea un documento vacío
– public Document(String k, Object v): Crea un documento con un
campo que tenga clave k y valor v.
– public Document([Link]<String, ?> m): Crea un documento
con un campo por cada par <clave, valor> en m.
• También sobrescribe los métodos equals, hashCode y
toString de la clase Object.
La clase Document
• La clase implementa al mismo tiempo las interfaces
[Link] y [Link].
• De esa última interfaz obtiene el método default
BsonDocument toBsonDocument() para obtener un
objeto BsonDocument con los datos de “este” Document.
La clase Document
• También contiene el método estático parse(String json) para crear un documento a partir de la
expresión json especificada.
• También contiene el método append(String k, Object v) para agregar un nuevo campo con clave
k y valor v y luego devuelve el documento resultante. Esto permite llamadas sucesivas a append
para agregar más campos.
• También se puede agregar un campo al documento con el método put(String k, Object v). La
diferencia entre put y append es que put devuelve el valor que antes estaba asociado a la clave k
si es que existía, o null en caso contrario.
• También se puede utilizar el método putAll(Map<String, ?> m) para agregar al documento todos
los campos definidos en m.
• También permite obtener el valor de un campo con los siguientes 2 métodos:
– public T get(Object k, Class<T> c): Obtiene el valor asociado a la clave k dentro del documento y, si lo
encuentra, lo convierte a la clase especificada en c. Si no lo encuentra, devuelve null. Si no es posible la
conversión, se lanzará un ClassCastException
– public T get(Object k, T defVal): Igual que el anterior, pero si no se encuentra el campo con la clave
especificada, se devuelve el valor de defVal.
La clase Document
• También permite obtener el valor de un campo en un
documento embebido con los siguientes 2 métodos:
– public T getEmbedded(List<?> k, Class<T> c): Obtiene el valor
asociado a las claves especificadas en k dentro del documento y, si
encuentra al menos uno, los convierte todos a la clase especificada
en c. Si no lo encuentra, devuelve null. Si no es posible la
conversión, o si el valor asociado a al menos una clave no es un
objeto Document, se lanzará un ClassCastException
– public T getEmmbedded(List<?> k, T defVal): Igual que el anterior,
pero si no se encuentra ningún campo con las claves especificadas,
se devuelve el valor de defVal.
La clase Document
• También permite obtener el valor de un campo en un tipo de dato
específico con los siguinetes métodos. Cada uno es equivalente a
llamar al método get especificando la clave y la instancia de class
correspondiente al tipo del objeto a obtener:
– public Integer getInteger(Object key)
– public int getInteger(Object key, int defVal)
– public Long getLong(Object key)
– public Double getDouble(Object key)
– public String getString(Object key)
– public Boolean getBoolean(Object key)
– public boolean getBoolean(Object key, boolean defVal)
– public Object get(Object key): Obtiene el valor sin hacerle conversión.
La clase Document
• También permite obtener el valor de un campo en un tipo de dato
específico con los siguinetes métodos. Cada uno es equivalente a
llamar al método get especificando la clave y la instancia de class
correspondiente al tipo del objeto a obtener (cont):
– public Date getDate(Object key)
– public List<T> getList(Object key, Class<T> c): Obtiene todos los elementos
de la lista apuntada por la clave key y convierte cada elemento a la clase
especificada por c. Si la clave no existe, se obtiene null. Si el valor asociado
a la clave no es una lista o la conversión no es posible, se lanzará un
ClassCastException
– public List<T> getList(Object key, Class<T> c, List<T> defVal): Igual que el
anterior, pero si la clave no existe, se obtiene defVal.
La clase Document
• También permite convertir el contenido del documento a un String en formato
JSON con el método toJSON()
• También permite eliminar un campo por su clave con el método remove(String
key). El método devuelve el valor asociado a esa clave antes de ser eliminado
• También permite eliminar todos los campos del documento con el método
clear().
• También permite obtener todas las claves presentes en el documento con el
método keySet. El valor devuelto es una instancia de [Link]<String>.
• También permite obtener una lista con todos los valores presentes en el
documento (incluyendo repetidos) con el método values(). El valor devuelto es
una instancia de [Link]<Object>
• También permite obtener un Set con cada campo en el documento con el
método entrySet(). El valor devuelto es una instancia de Set<[Link]<String,
Object>>
La clase Document
• También contiene métodos booleanos para validaciones:
– isEmpty(): Devuelve true si el documento no contiene campos
– containsKey(Object k): Devuelve true si existe un campo en el
documento con clave k.
– containsValue(Object v): Devuelve true si existe al menos un
campo en el documento con valor v.
La clase Decimal128
• Esta clase, ubicada en el paquete [Link], permite representar números
decimales de cuádruple precisión
• Un número decimal de cuádruple precisión es cualquier decimal de punto flotante de
128 bits que pueda ser representado por el estándar IEEE 754:2008 usando el
esquema de codificación BID.
• El esquema de codificación BID aplicado a la clase Decimal128 consiste en que cada
objeto Decimal128 contiene un número entero de alto orden y uno de bajo orden,
ambos de doble precisión. Cada uno puede ser obtenido con los siguientes métodos
getter:
– public long getHigh()
– public long getLow().
• Además, esta clase se definió como una extensión de la clase [Link], y
sobrescribe los métodos intValue(), longValue(), floatValue() y doubleValue() para
obtener la representación de “este” número, respectivamente, como un int, long, float o
double.
La clase Decimal128
• La clase, además, define las siguientes constantes:
– public static final Decimal128 POSITIVE_INFINITY para representar el número
infinito positivo
– public static final Decimal128 NEGATIVE_INFINITY para representar el número
infinito negativo
– public static final Decimal128 NaN para representar la expresión “not-a-number”
(No es un número)
– public static final Decimal128 NEGATIVE_NaN para representar la expresión
“not-a-number” con signo negativo.
– public static final Decimal128 POSITIVE_ZERO para representar el “cero
positivo”.
– public static final Decimal128 NEGATIVE_ZERO para representar el “cero
negativo”.
La clase Decimal128
• La clase, además, define los siguientes constructores:
– public Decimal128(long val): Crea un objeto Decimal128 a
partir del valor de val, utilizando la constante DECIMAL128
definida en la clase [Link] para indicar que de
val se debe extraer el número de alto orden y el de bajo orden.
– public Decimal128([Link] bdc): Crea un objeto
Decimal128 a partir del objeto bdc.
La clase Decimal128
• La clase, además, define los siguientes métodos propios:
– public static Decimal128 fromIEEE754BIDEncoding(long high, long low):
Crea un objeto Decimal128 a partir del número de alto orden (high) y el de
bajo orden (low)
– public BigDecimal bigDecimalValue(): Obtiene la representación del
número Decimal128 como un BigDecimal. El número no debe ser infinito,
“cero negativo” ni NaN, o se obtendrá una excepción.
– public boolean isNegative(): Devuelve true si “este” número es negativo
– public boolean isInfinite(): Devuelve true si “este” número es infinito.
– public boolean isFinite(): Devuelve true si “este” número no es infinito.
– public boolean isNan(): Devuelve true si “este” numero es NaN
La clase Decimal128
• La clase, además, implementa la interfaz
Comparable<Decimal128>, que contiene el método
compareTo(Decimal128 otr) para comparar los valores de
“este” número con otr, devolviendo un 1 si “este” número
es mayor que otr, un -1 si es menor o 0 si ambos son
iguales.
• Además, esta clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase BsonValue
• Esta clase abstracta ubicada en el paquete [Link] es la
súper clase de la cual son extensiones todas las clases
que representan tipos de dato BSON excepto las clases
Document y ObjectId.
• La clase sirve para representar valores asociados a
claves en un documento.
La clase BsonValue
• Las clases que extienden de BsonValue son
– BsonDocument (para documentos),
– BsonArray (para arreglos),
– BsonString (para strings),
– BsonInt32 (para números enteros de precisión simple), BsonInt64 (para enteros de doble
precisión),
– BsonDouble (para decimales de doble presición),
– BsonNumber (para cualquiera de los 3 tipos de dato anteriores),
– BsonDecimal128 (para decimales de cuádruple precisión),
– BsonBoolean (para booleanos)
– BsonObjectId (para ObjectId)
– BsonTimestamp (para fecha y hora en formato timestamp)
– BsonBinary (para datos binarios)
– BsonDateTime (fecha y hora)
– BsonRegularExpression (para expresiones regulares)
– BsonJavascript (código fuente en JavaScript)
– BsonNull (para valores nulos)
La clase BsonValue
• Tiene un único método abstracto llamado public abstract
BsonType getBsonType() que permite obtener el tipo
BSON del valor asociado a una clave.
– La enumeración BsonType, ubicada en el paquete [Link],
define constantes para representar tipos de datos reconocidos
por BSON.
– Para ver qué constantes fueron definidas en esa enumeración,
vea las definiciones de los métodos asXxxx() en las
diapositivas siguientes.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public BsonDocument asDocument(): Devuelve “este” objeto BsonValue
como un BsonDocument.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
– public BsonArray asArray(): Devuelve “este” objeto BsonValue como un
BsonArray.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
– public BsonString asString(): Devuelve “este” objeto BsonValue como un
BsonString.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public BsonNumber asNumber(): Devuelve “este” objeto BsonValue como un
BsonNumber.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de BsonType.INT32,
BsonType.INT64 o [Link], se lanzará una excepción.
– public BsonInt32 asInt32(): Devuelve “este” objeto BsonValue como un
BsonInt32.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
BsonType.INT32, se lanzará una excepción.
– public BsonInt64 asInt64(): Devuelve “este” objeto BsonValue como un
BsonInt64.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
BsonType.INT64, se lanzará una excepción.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public BsonDecimal128 asDecimal128(): Devuelve “este” objeto
BsonValue como un BsonDecimal128.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de
BsonType.DECIMAL128, se lanzará una excepción.
– public BsonDouble asDouble(): Devuelve “este” objeto BsonValue como
un BsonDouble.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
– public BsonInt64 asBoolean(): Devuelve “este” objeto BsonValue como un
BsonBoolean.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public BsonObjectId asObjectId(): Devuelve “este” objeto BsonValue
como un BsonObjectId.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de
BsonType.OBJECT_ID, se lanzará una excepción.
– public BsonTimestamp asTimestamp(): Devuelve “este” objeto BsonValue
como un BsonTimestamp.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
– public BsonBinart asBinary(): Devuelve “este” objeto BsonValue como un
BsonBinary.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public BsonObjectId asDateTime(): Devuelve “este” objeto BsonValue
como un BsonDateTime.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de
BsonType.DATE_TIME, se lanzará una excepción.
– public BsonRegularExpression asRegularExpression(): Devuelve “este”
objeto BsonValue como un BsonRegularExpression.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
BsonType.REGULAR_EXPRESSION, se lanzará una excepción.
– public BsonBinart asJavaScript(): Devuelve “este” objeto BsonValue como
un BsonJavaScript.
• Si el tipo de dato de “este” BsonValue no corresponde al valor de la constante
[Link], se lanzará una excepción.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public boolean isNull(): Devuelve true si “este” BsonValue es instancia de
BsonNull o false en caso contrario.
– public boolean isDocument(): Devuelve true si “este” BsonValue es instancia de
BsonDocument o false en caso contrario.
– public boolean isArray(): Devuelve true si “este” BsonValue es instancia de
BsonArray o false en caso contrario.
– public boolean isString(): Devuelve true si “este” BsonValue es instancia de
BsonString o false en caso contrario.
– public boolean isNumber(): Devuelve true si “este” BsonValue es instancia de
BsonInt32, BsonInt64 o BsonDouble; false en caso contrario.
– public boolean isInt32(): Devuelve true si “este” BsonValue es instancia de
BsonInt32 o false en caso contrario.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public boolean isInt64(): Devuelve true si “este” BsonValue es
instancia de BsonInt64 o false en caso contrario.
– public boolean isDouble(): Devuelve true si “este” BsonValue es
instancia de BsonDouble o false en caso contrario.
– public boolean isDecimal128(): Devuelve true si “este” BsonValue es
instancia de BsonDecimal128 o false en caso contrario.
– public boolean isBoolean(): Devuelve true si “este” BsonValue es
instancia de BsonBoolean o false en caso contrario.
– public boolean isObjectId(): Devuelve true si “este” BsonValue es
instancia de BsonObjectId o false en caso contrario.
La clase BsonValue
• Además, contiene los siguientes métodos:
– public boolean isTimestamp(): Devuelve true si “este” BsonValue es
instancia de BsonTimestamp o false en caso contrario.
– public boolean isBinary(): Devuelve true si “este” BsonValue es instancia
de BsonBinary o false en caso contrario.
– public boolean isDateTime(): Devuelve true si “este” BsonValue es
instancia de BsonDateTime o false en caso contrario.
– public boolean isRegularExpression(): Devuelve true si “este” BsonValue
es instancia de BsonRegularExpression o false en caso contrario.
– public boolean isJavaScript(): Devuelve true si “este” BsonValue es
instancia de BsonJavaScript o false en caso contrario.
La clase BsonElement
• Esta clase, perteneciente al paquete [Link], hace referencia a un
par (clave, valor).
• Cada miembro del par se puede obtener con los siguientes métodos
getter:
– public String getName(); para la clave
– public BsonValue getValue() para el valor.
• Posee un único constructor que admite como parámetros un String y
un BsonValue en ese orden para establecer la clave y valor que
tendrá el objeto BsonElement creado.
• También sobrescribe los métodos equals y hashCode de la clase
Object.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public static BsonDocument parse(String json): Crea un documento
BSON a partir de un String en formato JSON.
– public BsonDocument getDocument(Object k): Devuelve el valor
asociado a la clave k como un documento BSON.
• Se lanzará una excepción si no existe un campo con la clave k en el documento
o si el valor asociado a esa clave no es un documento BSON.
– public BsonArray getArray(Object k): Devuelve el valor asociado a la
clave k como un arreglo BSON.
• Se lanzará una excepción si no existe un campo con la clave k en el
documento o si el valor asociado a esa clave no es un arreglo
BSON.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonNumber getNumber(Object k): Devuelve el valor
asociado a la clave k en un tipo numérico reconocido por
BSON.
• Se lanzará una excepción si no existe un campo con la clave k en el
documento o si el valor asociado a esa clave no es un número.
– public BsonInt32 getInt32(Object k): Igual que el anterior, pero
solo para valores enteros de 32 bits.
– public BsonInt64 getInt64(Object k): Igual que el anterior, pero
solo para valores enteros de 64 bits.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonDecimal128 getDecimal128(Object k): Igual que el
anterior, pero solo para valores decimales de 128 bits.
– public BsonDouble getDouble(Object k): Igual que el anterior, pero
solo para valores decimales de doble precisión.
– public BsonBoolean getBoolean(Object k): Igual que el anterior,
pero solo para valores booleanos.
– public BsonString getString(Object k): Igual que el anterior, pero
solo para strings.
– public BsonDateTime getDateTime(Object k): Igual que el anterior,
pero solo para valores que representan fecha y hora.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonTimestamp getTimestamp(Object k): Igual que el anterior,
pero solo para fechas y horas expresadas en Timestamp.
– public BsonObjectId getObjectId(Object k): Igual que el anterior, pero solo
para el tipo ObjectId.
– public BsonRegularExpression getRegularExpression(Object k): Igual que
el anterior, pero solo para expresiones regulares.
– public BsonBinary getBinary(Object k): Igual que el anterior, pero solo
para datos binarios.
– public boolean isNull(Object k): Devuelve true si el campo con la clave k
existe en el documento y su valor es null. En caso contrario, devuelve
false.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public boolean isDocument(Object k): Devuelve true si el campo con la
clave k existe en el documento y representa un objeto BsonDocument.
– public boolean isArray(Object k): Devuelve true si el campo con la clave k
existe en el documento y representa un objeto BsonArray.
– public boolean isNumber(Object k): Devuelve true si el campo con la clave
k existe en el documento y representa un objeto BsonInt32, BsonInt64 o
BsonDouble.
– public boolean isInt32(Object k): Devuelve true si el campo con la clave k
existe en el documento y representa un objeto BsonInt32.
– public boolean isInt64(Object k): Devuelve true si el campo con la clave k
existe en el documento y representa un objeto BsonInt64.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public boolean isDouble(Object k): Devuelve true si el campo con la
clave k existe en el documento y representa un objeto BsonDouble.
– public boolean isDecimal128(Object k): Devuelve true si el campo con
la clave k existe en el documento y representa un objeto
BsonDecimal128.
– public boolean isBoolean(Object k): Devuelve true si el campo con la
clave k existe en el documento y representa un objeto BsonBoolean.
– public boolean isString(Object k): Devuelve true si el campo con la
clave k existe en el documento y representa un objeto BsonString.
– public boolean isDateTime(Object k): Devuelve true si el campo con la
clave k existe en el documento y representa un objeto BsonDateTime.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public boolean isTimestamp(Object k): Devuelve true si el campo con la clave k
existe en el documento y representa un objeto BsonTimestamp.
– public boolean isObjectId(Object k): Devuelve true si el campo con la clave k
existe en el documento y representa un objeto BsonObjectId.
– public boolean isBinary(Object k): Devuelve true si el campo con la clave k existe
en el documento y representa un objeto BsonBinary.
– public BsonValue get(Object k, BsonValue defVal): Si existe un campo con clave
k en el documento, devuelve el valor asociado a esa clave. En caso contrario,
devuelve el valor de defVal.
– public BsonDocument getDocument(Object k, BsonDocument defVal): Igual que
get, pero si la clave k existe y su valor asociado no es un BsonDocument, se
lanzará una excepción
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonArray getArray(Object k, BsonArray defVal): Igual que get, pero si la clave k
existe y su valor asociado no es un BsonArray, se lanzará una excepción.
– public BsonNumber getNumber(Object k, BsonNumber defVal): Igual que get, pero si la
clave k existe y su valor asociado no es un BsonInt32, BsonInt64 o BsonDouble, se
lanzará una excepción
– public BsonInt32 getInt32(Object k, BsonInt32 defVal): Igual que get, pero si la clave k
existe y su valor asociado no es un BsonInt32, se lanzará una excepción
– public BsonInt64 getInt64(Object k, BsonInt64 defVal): Igual que get, pero si la clave k
existe y su valor asociado no es un BsonInt64, se lanzará una excepción
– public BsonDouble getDouble(Object k, BsonDouble defVal): Igual que get, pero si la
clave k existe y su valor asociado no es un BsonDouble, se lanzará una excepción
– public BsonDecimal128 getDecimal128(Object k, BsonDouble defVal): Igual que get,
pero si la clave k existe y su valor asociado no es un BsonDecimal128, se lanzará una
excepción
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonBoolean getBoolean(Object k, BsonBoolean defVal): Igual que get, pero si la
clave k existe y su valor asociado no es un BsonBoolean, se lanzará una excepción
– public BsonString getString(Object k, BsonString defVal): Igual que get, pero si la clave k
existe y su valor asociado no es un BsonString, se lanzará una excepción
– public BsonDateTime getDateTime(Object k, BsonDouble defVal): Igual que get, pero si
la clave k existe y su valor asociado no es un BsonDateTime, se lanzará una excepción
– public BsonTimestamp getTimestamp(Object k, BsonTimestamp defVal): Igual que get,
pero si la clave k existe y su valor asociado no es un BsonTimestamp, se lanzará una
excepción
– public BsonObjectId getObjectId(Object k, BsonObjectId defVal): Igual que get, pero si la
clave k existe y su valor asociado no es un BsonObjectId, se lanzará una excepción
– public BsonBinary getBinary(Object k, BsonBinary defVal): Igual que get, pero si la clave
k existe y su valor asociado no es un BsonBinary128, se lanzará una excepción
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonRegularExpression getRegularExpression(Object k,
BsonRegularExpression defVal): Igual que get, pero si la clave k existe y
su valor asociado no es un BsonRegularExpression, se lanzará una
excepción.
– public BsonDocument append(String key, BsonValue val): Agrega un
nuevo campo con clave key y valor val al final de “este” documento y
devuelve el documento resultante.
– public String getFirstKey(): devuelve la clave del primer campo agregado
al documento. Si ese campo fue removido, en vez de eso, obtiene la clave
del campo siguiente. Si el documento está vacío al momento de llamar al
método, se lanzará una excepción.
La clase BsonDocument
• Además, posee, entre otros, los siguientes métodos:
– public BsonReader asBsonReader(): Devuelve una instancia
de BsonReader para leer el documento. El documento no debe
estar vacío o se lanzará una excepción.
• Además, implementa la interfaz Bson, la cual contiene el
método default BsonDocument toBsonDocument()
La clase BsonDocument
• Además, al implementar la interfaz Map<String, BsonValue>, esta clase contiene la
implementación de los métodos abstractos de esa interfaz (véase la documentación de la
interfaz [Link] para más detalles).
– La única salvedad es que la implementación del método put no permite valores nulos. Para
compensarlo, si usted desea especificar que el valor para una clave es nulo, utilice una instancia
de BsonNull.
• Además, también sobrescribe los métodos equals, hashCode, clone y toString de la clase
Object.
– El método toString devuelve la representación del documento en formato JSON. Ese mismo
resultado se puede obtener llamando al método toJson
• La clase también implementa la interfaz Cloneable para poder crear copias de “este”
documento con el método clone sin que se lance una excepción.
• La clase también es extensión de la clase JsonValue, por lo que
– Sobrescribe todos los métodos de esa clase
– El método getBsonType() devuelve la constante [Link]
La clase BsonArray
• Esta clase, ubicada en el paquete [Link], permite representar arreglos bajo la
notación BSON
• Esta clase es una extensión de BsonValue, por lo que:
– Hereda todos los métodos de esa clase
– Sobrescribe el método getBsonType() para que devuelva la constante [Link]
• La clase implementa la interfaz [Link]<BsonValue> para trabajar con una
lista interna de objetos BsonValue
• La clase contiene los siguientes constructores:
– public BsonArray(): Crea una lista vacía de valores con capacidad inicial de 10
elementos.
– public BsonArray(List<BsonValue> vals): Crea una lista de valores a partir de los
elementos de la lista vals con la capacidad actual de esa lista. Ninguno de los elementos
puede ser nulo.
– public BsonArray(int ic): Crea una lista vacía de valores con capacidad inicial de ic.
La clase BsonArray
• Además de los métodos heredados de BsonValue y los métodos
implementados de List<BsonValue>, la clase BsonArray tiene los siguientes
métodos:
– public static BsonArray parse(String json): Crea un objeto BsonArray a partir del
string json. Ese string debe corresponder al formato correcto de un arreglo en JSON.
– public List<BsonValue> getValues(): Obtiene una lista inmodificable con los valores
actualmente presentes en “este” arreglo.
• Esta clase también sobrescribe los métodos equals, hashCode, clone y
toString de la clase Object.
• Esta clase también implementa la interfaz Cloneable para permitir crear
copias de “este” arreglo con el método clone sin que se lance una excepción.
La clase BsonString
• Esta clase, ubicada en el paquete [Link], permite representar Strings bajo la
notación BSON utilizando un String interno que puede obtenerse llamado al método
public String getValue()
• Esta clase es una extensión de BsonValue, por lo que:
– Hereda todos los métodos de esa clase
– Sobrescribe el método getBsonType() para que devuelva la constante [Link]
• La clase implementa la interfaz [Link]<BsonString>, que contiene el
método public int compareTo(BsonString bs) para comparar el String interno de “este”
BsonString con el de bs usando la implementación que tiene la clase String de
compareTo()
• La clase contiene un único constructor que admite un objeto String como parámetro
para asignar su valor al String interno de “este” objeto BsonString.
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la clase
Object.
La clase BsonNumber
• Esta clase, ubicada en el paquete [Link], es la clase abstracta de la
cual son extensión las clases BsonInt32, BsonInt64, BsonDouble y
BsonDecimal128
• Contiene 4 métodos abstractos:
– public abstract int intValue() para obtener el valor encapsulado como un
entero
– public abstract long longValue() para obtener ese valor como un long.
– public abstract double doubleValue() para obtener ese valor como un double
– public abstract Decimal128 decimal128Value() para obtener ese valor como
una instancia de Decimal128.
• Además, también es una extensión de BsonValue, pero no implementa
el método getBsonType().
La clase BsonInt32
• Esta clase, ubicada en el paquete [Link], permite representar valores enteros en
formato BSON.
• La clase es una extensión de BsonNumber, por lo que implementa todos los
métodos de esa clase y de BsonValue
– La implementación de getBsonType() de BsonValue devuelve la constante
BsonType.INT32
• Además, la clase implementa la interfaz Comparable<BsonInt32>, que contiene el
método public int compareTo(BsonInt32 bi) para comparar numéricamente el valor
de “este” BsonInt32 con el valor de bi. El valor devuelto es 1 si el valor para “este”
objeto es mayor que bi, -1 si es menor o 0 si ambos son iguales.
• La clase cuenta con un único constructor que admite un entero como parámetro
para asignarle valor al entero encapsulado en el nuevo objeto BsonInt32
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la clase
Object.
La clase BsonInt64
• Esta clase, ubicada en el paquete [Link], permite representar
valores enteros de doble precisión en formato BSON.
• Para ello:
– Esta clase implementa la misma interfaz que BsonInt32, pero para
comparar un número long interno encapsulado en cada objeto BsonInt64
– La clase se definió como una extensión de BsonNumber, por lo que implementa
todos los métodos de esa clase y de BsonValue
• La implementación de getBsonType() de BsonValue devuelve la constante BsonType.INT64
– Esta clase sobrescribe los métodos equals, hashCode y toString de la
clase Object de igual manera que BsonInt32.
– Esta clase contiene un único constructor que admite un long como
parámetro para asignar valor al nuevo objeto.
La clase BsonDouble
• Esta clase, ubicada en el paquete [Link], permite representar valores
decimales de doble precisión en formato BSON.
• Para ello:
– Esta clase implementa la misma interfaz que BsonInt32, pero para comparar un
número double interno encapsulado en cada objeto BsonDouble
– La clase se definió como una extensión de BsonNumber, por lo que implementa
todos los métodos de esa clase y de BsonValue
• La implementación de getBsonType() de BsonValue devuelve la constante
[Link]
– Esta clase sobrescribe los métodos equals, hashCode y toString de la clase
Object de igual manera que BsonInt32.
– Esta clase contiene un único constructor que admite un double como
parámetro para asignar valor al nuevo objeto.
La clase BsonDecimal128
• Esta clase, ubicada en el paquete [Link], permite representar valores
decimales de cuádruple precisión en formato BSON.
• Para ello, cada instancia de esa clase cuenta con un objeto Decimal128
interno que puede obtenerse con el método public Decimal128 getValue()
• Esta clase contiene un único constructor que admite un objeto
Decimal128 como parámetro para asignar valor al nuevo objeto. El objeto
no debe ser nulo
• La clase se definió como una extensión de BsonNumber, por lo que implementa todos los
métodos de esa clase y de BsonValue.
– La implementación de getBsonType() de BsonValue devuelve la constante
BsonType.DECIMAL128
• Además, la clase sobrescribe los métodos equals, hashCode y toString
de la clase Object.
La clase BsonBoolean
• Esta clase, ubicada en el paquete [Link], permite representar
valores booleanos en formato BSON.
• Para ello, cada instancia de esa clase cuenta con un miembro
booleano interno que puede obtenerse con el método public boolean
getValue()
• Esta clase contiene un único constructor que admite un booleano
como parámetro para asignar valor al nuevo objeto.
• La clase, además, es extensión de la clase BsonValue, por lo que:
– hereda todos los métodos de esa clase
– el método getBsonType() devuelve la constante [Link]
• Además, la clase sobrescribe los métodos equals, hashCode y toString
de la clase Object.
La clase BsonBoolean
• Además, la clase implementa la interfaz
Comparable<BsonBoolean> que contiene el método
compareTo(BsonBoolean bb) para comparar los booleanos
internos de cada objeto utilizando el método compareTo de la
clase Boolean.
• Además, la clase define el método estático public static
BsonBoolean valueOf(boolean val) para crear un objeto
BsonBoolean a partir del resultado de la expresión val.
• Además, la clase define las constantes TRUE y FALSE para
hacer referencia a los valores true y false respectivamente.
La clase BsonObjectId
• Esta clase, ubicada en el paquete [Link], permite generar objetos que encapsulen
cada uno una instancia de ObjectId que puede obtenerse llamando al método public
ObjectId getValue().
• La clase tiene 2 constructores:
– public BsonObjectId(): Crea un BsonObjectId usando un nuevo ObjectId.
– public BsonObjectId(ObjectId oid): Crea un BsonObjectId a partir de oid, que no puede ser
nulo.
• La clase, además, es extensión de la clase BsonValue, por lo que:
– hereda todos los métodos de esa clase
– el método getBsonType() devuelve la constante BsonType.OBJECT_ID
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la clase
Object.
• Además, la clase implementa la interfaz Comparable<BsonObjectId>, que contiene el
método compareTo(BsonObjectId boid) para comparar dos ObjectId utilizando el
método compareTo de esa clase.
La clase BsonTimestamp
• Esta clase, ubicada en el paquete [Link], permite representar timestamps.
• Para ello, cada objeto cuenta con un long interno que representa la fecha (en formato UNIX) e incremento.
Ese número puede obtenerse usando el método public long getValue()
• Además, se puede obtener la fecha y el incremento a partir del número interno con los siguientes métodos
getter:
– public int getTime()
– public int getIncrement()
• La clase tiene 3 constructores:
– public BsonTimestamp(): Crea un BsonTimestamp con fecha 01/01/1970 00:00 e incremento 0.
– public BsonTimestamp(long t): Crea un BsonTimestamp a partir con fecha e incremento extraidos de t.
– public BsonTimestamp(int sec, int increment): Crea un BsonTimestamp a partir de la fecha e incremento especificados.
• La clase, además, es extensión de la clase BsonValue, por lo que:
– hereda todos los métodos de esa clase
– el método getBsonType() devuelve la constante [Link]
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la clase Object.
• Además, la clase implementa la interfaz Comparable<BsonTimestamp>, que contiene el método
compareTo(BsonTimestamp boid) para comparar el número interno de 2 objetos.
La clase BsonDateTime
• Esta clase, ubicada en el paquete [Link], permite representar fecha y hora.
• Usar un objeto BsonDateTime equivale a usar un objeto BsonTimestamp asumiendo
incremento 0, por lo que para obtener el valor de la fecha en formato UNIX, basta con
usar el método public long getValue().
• La clase tiene un único constructor que admite un número long para asignar la fecha al
nuevo objeto.
• La clase, además, es extensión de la clase BsonValue, por lo que:
– hereda todos los métodos de esa clase
– el método getBsonType() devuelve la constante BsonType.DATE_TIME
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la clase
Object.
• Además, la clase implementa la interfaz Comparable<BsonTimestamp>, que contiene el
método compareTo(BsonTimestamp boid) para comparar el número interno de 2
objetos.
La clase BsonBinary
• Esta clase, ubicada en el paquete [Link],
permite representar datos binarios.
• Para ello, cada objeto cuenta con un byte interno
para representar el tipo de dato binario y un arreglo
de bytes con el contenido. Ambos miembros se
pueden obtener con los siguientes métodos getter:
– public byte getType()
– public byte[ ] getData()
La clase BsonBinary
• La clase tiene 5 constructores:
– public BsonBinary(BsonBinarySubType st, byte[] data): Crea un
BsonBinary con el tipo definido en st y el contenido definido en
data. Los parámetros no pueden ser nulos o se obtendrá una
excepción
– public BsonBinary(byte b, byte[ ] data): Crea un BsonBinary a
partir del tipo y contenido especificados. El parámetro data no
debe ser nulo o se lanzará una excepción.
– public BsonBinary(byte[ ] data): Equivale a llamar a new
BsonBinary([Link], data)
La clase BsonBinary
• La clase tiene 5 constructores (cont):
– public BsonBinary([Link] uuid, UuidRepresentation rep): Crea
un BsonBinary a partir de un objeto UUID y una representación rep.
Dependiendo del valor de rep será el byte asignado como tipo para el
nuevo objeto, que puede ser el valor devuelto por
BsonBinarySubType.UUID_STANDARD.getValue() si el valor de rep
es [Link] o
BsonBinarySubType.UUID_LEGACY en caso contrario.
• El valor de rep no debe ser [Link] o se lanzará una
excepción.
– public BsonBinary(UUID uuid): Equivale a llamar a new BsonBinary(uuid,
[Link])
La clase BsonBinary
• La clase tiene además, los siguentes métodos:
– public UUID asUuid(UuidRepresentation rep): Obtiene el dato
binario como un objeto UUID en la representación especificada.
• Se lanzará una excepción si
– El valor de rep es nulo
– El valor del tipo de “este” objeto no es el valor devuelto por
BsonBinarySubType.UUID_STANDARD.getValue() o
BsonBinarySubType.UUID_LEGACY.getValue()
– El valor de rep es [Link] y el valor del tipo de “este”
objeto no es BsonBinarySubType.UUID_STANDARD.getValue()
– El valor de rep es distinto de [Link] y el valor del
tipo de “este” objeto es BsonBinarySubType.UUID_STANDARD.getValue()
La clase BsonBinary
• La clase tiene además, los siguentes métodos:
– public UUID asUuid(): Obtiene el dato binario como un
objeto UUID usando la representación
[Link].
• Se lanzará una excepción si el valor del tipo de “este” objeto
no es el devuelto por
BsonBinarySubType.UUID_STANDARD.getValue()
– public static BsonBinary clone(BsonBinary from): Crea
y devuelve una copia del objeto from.
La clase BsonBinary
• La clase, además, es extensión de la clase BsonValue, por lo
que:
– hereda todos los métodos de esa clase
– el método geBsonType() devuelve la constante [Link]
• Además, la clase sobrescribe los métodos equals, hashCode y
toString de la clase Object.
• Además, la clase implementa la interfaz
Comparable<BsonTimestamp>, que contiene el método
compareTo(BsonTimestamp boid) para comparar el número
interno de 2 objetos.
La enumeración BsonBinarySubType
• La enumeración BsonBinarySubType, definida en el paquete [Link], define las siguientes
constantes para representar tipos de datos binarios:
– BINARY (datos binarios comunes),
– FUNCTION (función),
– UUID_LEGACY (UUID en un orden de byte antiguo que es driver-dependiente),
– UUID_STANDARD (UUID en orden de bytes estándar de red),
– MD5 (hash MD5),
– ENCRYPTED (datos encriptados),
– COLUMN (datos columnares)
– USER_DEFINED (definido por el usuario)
• Además, cada constante está asociada a un número de tipo byte, que puede obtenerse con el
método public byte getValue().
• Además, la enumeración define el método estático public static boolean isUuid(byte b), que
devuelve true si b es igual al valor devuelto por
BsonBinarySubType.UUID_STANDARD.getValue() o
BsonBinarySubType.UUID_LEGACY.getValue()
La enumeración UuidRepresentation
• La enumeración UuidRepresentation, definida en el paquete
[Link], define las siguientes constantes para representar los
tipos de representaión de UUID
– UNSPECIFIED: Nulo o no especificado
– STANDARD: Representación estándar o canónica
– C_SHARP_LEGACY: Representación legacy utilizada por el driver
del lenguaje C#
– JAVA_LEGACY: Representación legacy utilizada por el driver del
lenguaje JAVA
– PYTHON_LEGACY: Representación legacy utilizada por el driver
del lenguaje Python
La clase BsonRegularExpression
• Esta clase, ubicada en el paquete [Link], permite
representar expresiones regulares en formato BSON.
• Para ello, cada objeto cuenta con dos Strings: uno
para el patrón y uno para las opciones. Ambos
miembros se pueden obtener con los siguientes
métodos getter:
– public String getPattern()
– public String getOptions()
La clase BsonRegularExpression
• La clase, además, tiene los siguientes constructores:
– public BsonRegularExpression(String p, String o): Crea un
objeto BsonRegularExpression a partir del patron p y las
opciones especificadas en o.
• El valor de p no puede ser nulo y debe ser cualquier String que
pueda ser devuelto por el método pattern() de la clase
[Link].
• El valor de o puede ser nulo o vacío para indicar que no hay
opciones.
– public BsonRegularExpression(String p): Equivale a llamar a
new BsonRegularExpression(p, null)
La clase BsonRegularExpression
• La clase, además, es extensión de la clase
BsonValue, por lo que:
– hereda todos los métodos de esa clase
– el método geBsonType() devuelve la constante
BsonType.REGULAR_EXPRESSION
• Además, la clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase BsonJavaScript
• Esta clase, ubicada en el paquete [Link], permite representar código
JavaScript bajo la notación BSON utilizando un String interno (que debe ser
código JavaScript válido) que puede obtenerse llamado al método public String
getCode()
• Esta clase es una extensión de BsonValue, por lo que:
– Hereda todos los métodos de esa clase
– Sobrescribe el método getBsonType() para que devuelva la constante
[Link]
• La clase contiene un único constructor que admite un objeto String como
parámetro para asignar su valor al String interno de “este” objeto
BsonJavaScript.
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la
clase Object.
La clase BsonNull
• Esta clase, ubicada en el paquete [Link], permite representar la
expresión null, utilizada en BSON para asignar valores nulos a un campo
cualquiera de un documento cualquiera.
• Esta clase es una extensión de BsonValue, por lo que:
– Hereda todos los métodos de esa clase
– Sobrescribe el método getBsonType() para que devuelva la constante
[Link]
• La clase contiene únicamente el constructor por defecto y no es necesario
invocarlo, ya que la misma clase proporciona la constante VALUE que es
una instancia de esa clase.
• Además, la clase sobrescribe los métodos equals, hashCode y toString
de la clase Object.
Clases de MongoDB para conexión con bases de
datos desde JAVA
La clase ConnectionString
• Esta clase, que pertenece al paquete [Link], sirve para
manejar los datos obtenidos de la URL de conexión
• Contiene un único constructor que acepta un String con la URL de
conexión.
• Además, contiene métodos públicos getter para obtener los datos
extraidos de la URL de conexión:
– public String getUsername() para obtener el nombre de usuario
– public char[ ] getPassword() para obtener la contraseña
– public boolean isSrvProtocol(): Devuelve true si la URL de conexión empieza
con mongodb+srv
• También sobrescribe los métodos equals y hashCode de la clase
Object.
La clase ServerApi
• Esta clase, que pertenece al paquete [Link], sirve para establecer
configuración de uso del API de MongoDB.
• La clase no tiene constructores públicos, pero tiene una clase interna
estática llamada Builder con un método build() (que puede ser obtenido con
el método estático builder() de ServerApi) para crear el objeto ServerApi y
los siguientes métodos, que devuelven un objeto [Link], para
asignar valores a sus atributos:
– public Builder version(ServerApiVersion v): Permite establecer la versión del API de
MongoDB con la que se trabajará.
– public Builder deprecationErrors(boolean markAsError): Permite establecer si se
debe marcar como error el uso de una API deprecada.
– public Builder strict(boolean isStrict): Permite establecer si se requiere un
reforzamiento estricto del API.
La clase ServerApi
• La clase también posee métodos getter para obtener sus
atributos:
– public ServerApiVersion getVersion() para la versión
– public [Link]<Boolean> getStrict() para el atributo strict.
Es posible que el valor obtenido sea null.
– public [Link]<Boolean> getDeprecationErrors() para el
atributo deprecationErrors. Es posible que el valor obtenido sea
null
• Además, la clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La enumeración ServerApiVersion
• Esta enumeración, que pertenece al paquete
[Link], contiene todas las versiones posibles del
API de MongoDB para poder utilizar.
• Hasta la fecha, la única constante existente en la
enumeración es V1, que hace referencia a la versión 1.
La clase MongoClientSettings
• Esta clase, que pertenece al paquete [Link], permite
establecer la configuración del objeto de conexión al servidor.
• No posee constructores públicos, pero posee una clase interna
llamada Builder que contiene el método build para obtener un
nuevo objeto MongoClientSettings y contiene métodos, que
devuelven un objeto [Link] para
establecer los valores que tendrán los atributos del objeto
MongoClientSettings. Se puede obtener un objeto
[Link] con el método estático builder() de
MongoClientSettings.
La clase MongoClientSettings
• De todos los métodos de [Link], los más fundamentales son:
– public [Link] applyConnectionString(ConnectionString cs) para establecer la
URL de conexión. El objeto cs no puede ser nulo.
– public [Link] retryWrites(boolean rw): establece si una operación de
escritura debe reintentarse debido a un error de red
– public [Link] retryReads(boolean rr): Igual que retryWrites pero para
operaciones de lectura
– public [Link] credential(MongoCredential cr): establece las credenciales de
conexión si es que estas no fueron incluidas en la URL de conexión. El objeto cr no puede ser nulo.
– public [Link] serverApi(ServerApi sa): Establece la configuración del API del
servidor. El objeto sa no puede ser nulo.
– public [Link] applicationName(String an): Establece el nombre de la
aplicación para términos de identificación de la aplicación al servidor, logs del servidor, logs de
consultas lentas, etc. El parámetro an puede ser nulo, pero si no lo es, debe ser un String tal que
el arreglo de bytes resultante de codificar el parámetro usando UTF-8 no debe exceder los 128
elementos.
La clase MongoClientSettings
• De todos los métodos de [Link], los más
fundamentales son:
– public [Link] readPreference(ReadPreference rp):
Permite establecer las preferencias de lectura. El objeto rp no puede ser nulo.
– public [Link]
applyToSocketSettings(Block<[Link]> block): Permite
establecer configuración del socket como un bloque.
• La interfaz Block<T>, del paquete [Link], es una interfaz funcional que
contiene un único método llamado public void apply(T obj). Por lo tanto, se puede
usar expresiones lambda como parámetro de applyToSocketSettings y de cualquier
método que requiera de un objeto Block<?> como parámetro.
• El objeto block, en este y en todos los demás métodos que requieren un objeto
Block<?>, no puede ser nulo.
La clase MongoClientSettings
• De todos los métodos de [Link], los más
fundamentales son:
– public [Link]
applyToConnectionPoolSettings(Block<[Link]
der> block): Permite establecer configuración del pool de conexión.
– public [Link]
applyToServerSettings(Block<[Link]> block):
Permite establecer configuración de servidor.
– public [Link]
applyToSslSettings(Block<[Link]> block): Permite
establecer configuración del uso del protocolo SSL.
La clase MongoClientSettings
• Además, posee métodos getter para obtener los atributos asignados
por la llamada al método build() de la clase interna Builder:
– public ConnectionString getConnectionString() para la configuración de la
URL de conexión
– public MongoCredential getMongoCredential() para las credenciales de
conexión
– public ReadPreference getReadPreference() para obtener las preferencias
de lectura
– public boolean retryReads() para averiguar si está habilitado el reintento de
lectura
– public boolean retryWrites() para averiguar si está habilitado el reintento de
escritura.
La clase MongoClientSettings
• Además, posee métodos getter para obtener los atributos asignados
por la llamada al método build() de la clase interna Builder:
– public String getApplicationName() para el nombre de la aplicación
– public ServerApi getServerApi() para la configuración del API del servidor
– public SslSettings getSslSettings() para la configuración de SSL.
– public SocketSettings getSocketSettings() para la configuración de las
conexiones de socket.
– public ConnectionPoolSettings getConnectionPoolSettings() para la
configuración del pool de conexión
– public ServerSettings getServerSettings() para la configuración del servidor.
La clase MongoClientSettings
• Considere que para todos los métodos getter que se
llamen getXxxSettings(), el objeto devuelto es el
resultado de llamar al método build() de la clase
[Link] correspondiente.
• Además, esta clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase MongoCredential
• Si usted no especificó el nombre de usuario y contraseña
en la URL de conexión, usted puede especificarla
creando una instancia de la clase
[Link] e incorporarla a un
objeto MongoClientSettings.
• La clase MongoCredential no tiene constructores públicos,
pero cuenta con métodos estáticos para poder crear un
objeto MongoCredential.
La clase MongoCredential
• Los métodos estáticos para crear un MongoCredential son:
– public static MongoCredential createCredential(String user, String
db, char[ ] pass): Crea un objeto a partir del nombre de un usuario
existente en la base de datos especificada con su contraseña. Si
no se creó el usuario en una base de datos específica, el valor de
db puede ser el string “$external”. Dependiendo de la versión del
servidor, este método negociará el mejor mecanismo de
autentificación:
• Si la versión es 4.0 o superior, preferirá el mecanismo SCRAM-SHA-256
• Para las versiones 3.x, se preferirá el mecanismo SCRAM-SHA-1
• Para las demás versiones, se preferirá el mecanismo MONGODB_CR
La clase MongoCredential
• Los métodos estáticos para crear un MongoCredential son:
– public static MongoCredential createScramSha1Credential(String user, String db,
char[ ] pass): Igual que createCredential, pero especificando el mecanismo
SCRAM_SHA_1
– public static MongoCredential createScramSha256Credential(String user, String db,
char[ ] pass): Igual que createCredential, pero especificando el mecanismo
SCRAM_SHA_256
– public static MongoCredential createMongoX509Credential(String user): Especifica
el mecanismo MONGODB_X509 para la autentificación del usuario utilizando un
certificado digital incorporado en el servidor. Todos los usuarios autentificados de
esa manera existen únicamente en la base de datos $external.
– public static MongoCredential createMongoX509Credential(): Igual que el anterior,
pero utilizando el nombre de sujeto encapsulado en el certificado del cliente como su
nombre de usuario.
La clase MongoCredential
• Los métodos estáticos para crear un MongoCredential son:
– public static MongoCredential createGSSAPICredential(String user):
Utiliza el mecanismo GSSAPI para autentificación con el usuario user. Al
igual que con MONGODB_X509, los usuarios existen en la base de datos
$external.
– public static MongoCredential createPlainCredential(String user, String db,
char[ ] pass): Igual que con createCredential, pero con el mecanismo de
autentificación simple (RFC 4616)
– public static MongoCredential createAwsCredential(String user, char[ ]
pass): Utiliza el mecanismo MONGODB_AWS para autentificación con un
usuario definido en Amazon Web Services con su contraseña. Los
usuarios existen en la base de datos $external.
La clase MongoCredential
• Además, la clase proporciona los siguientes métodos:
– public MongoCredential withMechanismProperty(String key, Object val): Agrega una
propiedad de mecanismo al mapa interno del objeto y devuelve el objeto resultante.
• La clave de la propiedad a agregar debe ser estrictamente el valor de una de las siguientes
constantes de tipo String definidas en MongoCredential:
– SERVICE_NAME_KEY: Un string con el nombre del servicio a utilizar con la autentificación GSSAPI. Si no
se especifica, se asume “mongodb”
– CANNONICALIZE_HOST_NAME_KEY: Un string con valor “true” si se desea forzar canonicalización del
nombre del host antes de la autentificación; “false” en caso contrario. Úsese con autentificación GSSAPI
– JAVA_SUBJECT_KEY: Su valor debe ser una instancia de [Link] que será utilizado
para la autentificación GSSAPI
– JAVA_SUBJECT_PROVIDER_KEY: Su valor debe ser una instancia de la interfaz
[Link]. La interfaz es funcional y contiene un único método abstracto llamado
getSubject. Usar esta clave con un objeto SubjectProvider sp es equivalente a usar la clave
JAVA_SUBJECT_KEY con el valor [Link](). Úsese para autentificación GSSAPI.
– AWS_SESSION_TOKEN_KEY: String con el token de autentificación para el mecanismo MONGODB_AWS.
La clase MongoCredential
• Además, la clase proporciona los siguientes métodos:
– public MongoCredential
withMechanism(AuthenticationMechanism mec): Permite
establecer el mecanismo de autentificación y devuelve el objeto
resultante. El objeto desde donde se llama a este método debe
haber sido creado con el método createCredential y no deben
existir llamadas previas a withMechanism desde el mismo
objeto, o se lanzará un IllegalArgumentException.
– public String getMechanism(): Obtiene el nombre del
mecanismo de autentificación establecido
La clase MongoCredential
• Además, la clase proporciona los siguientes métodos:
– public AuthenticationMechanism getAuthenticationMechanism(): Obtiene el
objeto del mecanismo de autentificación establecido
– public String getUserName(): Obtiene el nombre del usuario
– public char[ ] getPassword(): Obtiene la contraseña. Dependiendo del
método de autentificación establecido, puede ser null.
– public T getMechanismProperty(String key, T defVal): Permite obtener la
propiedad de mecanismo especificada por la clave key. Véase el método
withMechanismProperty para valores posibles de key y T.
• Además, la clase sobrescribe los métodos equals, hashCode y toString
de la clase Obiect. Para el caso de toString, no se muestra la
contraseña, por razones obvias.
La enumeración AuthenticationMechanism
• Esta enumeración, definida en el paquete [Link], contiene
las siguientes constantes para los posibles mecanismos de
autentificación: GSSAPI, MONGODB_AWS, MONGODB_X509,
PLAIN, SCRAM_SHA_1 y SCRAM_SHA_256
La clase SocketSettings
• Esta clase, que pertenece al paquete
[Link], permite establecer
configuraciones de conexión por socket a un servidor de
MongoDB para agregarlas a un objeto .
• No posee constructores públicos, pero posee una clase
interna llamada Builder, de la cual se puede obtener un
objeto con el método estático builder() de SocketSettings
La clase SocketSettings
• A partir de la clase [Link], además de poder llamar al
método build() para crear el objeto SocketSettings, se puede llamar a
cualquiera de los siguientes métodos antes de build()
– public Builder applySettings(SocketSettings sa): Copia los valores de los
atributos de sa para ser incorporados al nuevo objeto SocketSettings.
– public Builder connectTimeout(int time, [Link] tu):
Establece el tiempo de espera antes de que se cierre la conexión por timeout. El
tiempo, expresado en la unidad de tiempo especificada, es convertido en
milisegundos.
• La enumeración TimeUnit define constantes para representar unidades de medida del tiempo
– public Builder readTimeout(int time, TimeUnit tu): Igual que el anterior, pero para
cierre de cualquier operación de lectura.
– public Builder receiveBufferSize(int buf): Tamaño máximo del buffer de
recepción.
– public Builder sendBufferSize(int buf): Tamaño máximo del buffer de envío.
La clase SocketSettings
• A partir de la clase [Link], además de poder
llamar al método build() para crear el objeto SocketSettings, se
puede llamar a cualquiera de los siguientes métodos antes de
build() (cont)
– public Builder applyConnectionString(ConnectionString cs): Establece los
valores del timeout de conexión y el de lectura a partir de los campos
connectTineout y socketTimeout respectivamente extraidos de la query
string de la URL de conexión.
La clase SocketSettings
• Además, SocketSettings contiene métodos getter para cada
atributo establecido con el Builder:
– public int getConnectTimeout()
– public int getReadTimeout()
– public int getReceiveBufferSize()
– public int getSendBufferSize()
• Además, también sobrescribe los métodos equals, hashCode y
toString de la clase Object
La clase ConnectionPoolSettings
• Esta clase, que pertenece al paquete
[Link], permite establecer
configuraciones de pool de conexión.
• No posee constructores públicos, pero posee una clase
interna llamada Builder, de la cual se puede obtener un
objeto con el método estático builder() de
ConnectionPoolSettings
La clase ConnectionPoolSettings
• A partir de la clase [Link], además de poder llamar
al método build() para crear el objeto ConnectionPoolSettings, se puede
llamar a cualquiera de los siguientes métodos antes de build()
– public Builder applySettings(ConnectionPoolSettings sa): Copia los valores de los
atributos de sa para ser incorporados al nuevo objeto ConnectionPoolSettings.
– public Builder maxSize(int s): Establece la cantidad máxima de conexiones
permitidas.
• Si no se especifica una cantidad, se asume un máximo de 100 conexiones.
– public Builder minSize(int s): Establece la cantidad mínima de conexiones permitidas.
• Si no se especifica una cantidad, se asume un mínimo de 0 conexiones.
– public Builder maxWaitTime(long time, TimeUnit tu): Cantidad máxima de tiempo
que un proceso puede esperar a que una conexión esté disponible.
• Si no se especifica una cantidad, se asume que las conexiones duran 2 minutos.
• Un 0 en cualquier unidad de tiempo significa que no habrá un tiempo de espera.
• Un -1 en cualquier unidad de tiempo significa que la espera es por tiempo indefinido.
La clase ConnectionPoolSettings
• A partir de la clase [Link], además de poder
llamar al método build() para crear el objeto ConnectionPoolSettings, se
puede llamar a cualquiera de los siguientes métodos antes de build()
(cont)
– public Builder maxConnectionLifeTime(long time, TimeUnit tu): Cantidad máxima de
tiempo de vida (TTL) de una conexión. Una vez transcurrido el tiempo, la conexión
se cerrará automáticamente y, de ser necesario, será reemplazada por una nueva.
• Un 0 en cualquier unidad de tiempo significa que las conexiones tienen TTL indefinido.
– public Builder maxConnectionIdleTime(long time, TimeUnit tu): Cantidad máxima de
tiempo que una conexión puede estar inactiva antes de ser cerrada
automáticamente y, de ser necesario, ser reemplazada por una nueva.
• Un 0 en cualquier unidad de tiempo significa que las conexiones pueden tener un tiempo de
inactividad indefinido.
La clase ConnectionPoolSettings
• A partir de la clase [Link], además de poder llamar
al método build() para crear el objeto ConnectionPoolSettings, se puede
llamar a cualquiera de los siguientes métodos antes de build() (cont)
– public Builder maintenanceInitialDelay(long time, TimeUnit tu): Tiempo de espera
antes de ejecutar el primer trabajo de mantenimiento en el pool de conexión
– public Builder maintenanceFrequency(long time, TimeUnit tu): Período de tiempo
entre ejecuciones de trabajos de mantenimiento en el pool de conexión.
– public Builder addConnectionPoolListener(ConnectionPoolListener cpl): Permite
agregar un “oyente” para capturar eventos relacionados con el pool de conexión.
• Un objeto ConnectionPoolSettings puede tener más de un ConnectionPoolListener a la vez.
• El parámetro cpl no puede ser nulo.
La clase ConnectionPoolSettings
• A partir de la clase [Link], además de poder
llamar al método build() para crear el objeto ConnectionPoolSettings, se
puede llamar a cualquiera de los siguientes métodos antes de build()
(cont)
– public Builder connectionPoolListenersList([Link]<ConnectionPoolListener>
cpls): Reemplaza todos los ConnectionPoolListeners actualmente almacenados en
el Builder por los del parámetro cpls
• El parámetro cpls no puede ser nulo, pero puede estar vacío
– public Builder maxConnecting(int max): Establece la máxima cantidad de
conexiones concurrentes en el pool. Debe ser mayor que cero.
– public builder applyConnectionString(ConnectionString cs): Permite establecer el
máximo y mínimo de conexiones, el máximo tiempo de espera, el máximo tiempo de
inactividad, el máximo TTL y la máxima cantidad de conexiones concurrentes a
partir de la información extraida del querystring de la URL de conexión
La clase ConnectionPoolSettings
• Además, contiene métodos getter para cada atributo establecido desde su Builder:
– public int getMaxSize()
– public int getMinSize()
– public long getMaxWaitTime(TimeUnit tu) para obtener el máximo tiempo de espera
expresado en la unidad especificada en el objeto tu
– public long getMaxConnectionIdleTime(TimeUnit tu) para el máximo tiempo de inactividad
– public long getMaxConnectionLifeTime(TimeUnit tu) para el TTL
– public long getMaintenanceInitialDelay(TimeUnit tu) para el tiempo de espera antes del primer
mantenimiento
– public long getMaintenanceFrequency(TimeUnit tu) para el período entre mantenimientos
– public List<ConnectionPoolListener> getConnectionPoolListening() para los oyentes del pool
– public int getMaxConnecting() para el máximo de conexiones paralelas.
• Además, sobrescribe los métodos equals, hashCode y toString de la clase Object
La interfaz ConnectionPoolListener
• Por defecto, cada vez que ocurre un evento relacionado con el pool de conexión, no
sucede absolutamente nada adicional.
• Pero es posible hacer algo para uno o más eventos creando una o varias clases que
implementen la interfaz ConnectionPoolListener, ubicada en el paquete
[Link].
• Luego, para la(s) clase(s) creadas, sobrescribir al menos un método definido en la
interfaz.
• No es necesario implementar todos los métodos de la interfaz, ya que éstos fueron
declarados en ella como métodos por defecto.
• Todos los métodos de la interfaz, además de ser métodos por defecto, no devuelven
valores y admiten un único parámetro que es instancia de una clase de evento definida
en el mismo paquete que la interfaz.
• No es necesario llamar manualmente a los métodos de la interfaz, ya que cada uno de
éstos es llamado automáticamente cuando ocurre un evento determinado.
La interfaz ConnectionPoolListener: métodos
• default void connectionPoolCreated(ConnectionPoolCreatedEvent ev):
método invocado automáticamente cuando se crea un pool de
conexión.
– El objeto ev, al ser instancia de ConnectionPoolCreatedEvent, contiene la
información del Id del servidor y la configuración del pool de conexión, que
pueden obtenerse con los siguientes métodos getter:
• public ServerId getServerId()
• public ConnectionPoolSettings getConnectionPoolSettings()
– Además, la clase ConnectionPoolCreatedEvent sobrescribe el método toString
de la clase Object.
– La clase ConnectionPoolCreatedEvent tiene un único constructor que admite un
objeto ServerId y un objeto ConnectionPoolSettings. Ninguno de ellos puede ser
nulo.
La interfaz ConnectionPoolListener: métodos
• default void connectionPoolCleared(ConnectionPoolClearedEvent ev):
método invocado automáticamente cuando se limpia y se deja en pausa un
pool de conexión.
– El objeto ev, al ser instancia de ConnectionPoolClearedEvent, contiene la id del
servicio como un ObjectId (que puede ser nula) y de la id del servidor, que pueden
obtenerse con los siguientes métodos getter:
• public ServerId getServerId()
• public ObjectId getServiceId()
– Además, la clase ConnectionPoolClearedEvent sobrescribe el método toString de la
clase Object.
– Además, esa misma clase tiene 2 constructores para inicializar la Id del servidor y,
opcionalmente, la del servicio:
• public ConnectionPoolClearedEvent(ServerId srvid)
• public ConnectionPoolClearedEvent(ServerId srvid, ObjectId svcid)
La interfaz ConnectionPoolListener: métodos
• default void connectionPoolReady(ConnectionPoolReadyEvent ev),
default void connectionPoolClosed(ConnectionPoolClosedEvent ev) y
default void
connectionCheckoutStarted(ConnectionCheckoutStartedEvent ev):
métodos invocados automáticamente cuando un pool de conexión está
listo, un pool de conexión está está cerrado o cuando se empieza a
sacar una conexión del pool.
– Las instancias de las clases en los argumentos de cada método contienen la
id del servidor, que pueden obtenerse con el método public ServerId
getServerId()
– Además, cada una de estas clases sobrescriben el método toString de la
clase Object y tienen cada una un único constructor que admite un objeto
ServerId.
La interfaz ConnectionPoolListener: métodos
• default void connectionCheckedOut(ConnectionCheckedOutEvent ev),
default void connectionCheckedIn(ConnectionCheckedInEvent ev),
default void connectionCreated(ConnectionCreatedEvent ev) y default
void connectionReady(ConnectionReadyEvent ev): métodos invocados
automáticamente cuando, respectivamente, se termina de sacar una
conexión desde un pool, se termina de agregar una conexión al pool,
se crea una conexión y una conexión está lista.
– Las instancias de las clases en los parámetros de cada método contienen la id
de la conexión, que puede obtenerse con el método public ConnectionId
getConnectionId
– Además, ambas clases sobrescriben el método toString de la clase Object y
contienen un único constructor que admite un ConnectionId como parámetro.
La interfaz ConnectionPoolListener: métodos
• default void connectionCheckOutFailed(ConnectionCheckOutFailedEvent ev):
método invocado automáticamente cuando un intento de sacar una conexión desde
un pool falla debido a un error.
– La clase ConnectionCheckOutFailedEvent contiene una enumeración interna pública llamada
Reason para definir constantes que indican las razones posibles para la falla de un checkout:
POOL_CLOSED (pool cerrado), TIMEOUT (tiempo expirado), CONNECTION_ERROR (error
al habilitar una nueva conexión) y UNKNOWN (error desconocido)
– Una instancia de ConnectionCheckOutFailedEvent contiene la id del servidor y la razón de la
falla, que pueden obtenerse con los siguientes métodos getter:
• public ServerId getServerId()
• public Reason getReason()
– Además, la clase ConnectionCheckOutFailedEvent sobrescribe el método toString de la clase
Object y contiene un único constructor que admite un objeto ServerId y un objeto Reason
como parámetro.
La interfaz ConnectionPoolListener: métodos
• default void connectionClosed(ConnectionClosedEvent ev): método invocado
automáticamente cuando se cierra una conexión.
– La clase ConnectionCheckOutFailedEvent contiene una enumeración interna pública
llamada Reason para definir constantes que indican las razones posibles para el cierre
de una conexión: STALE (Conexión inválida debido a que se limpió el pool), IDLE
(conexión inactiva por mucho tiempo), ERROR (error en la conexión) y POOL_CLOSED
(pool cerrado)
– Una instancia de ConnectionClosedEvent contiene la id de la conexión y la razón de su
cierre, que pueden obtenerse con los siguientes métodos getter:
• public ConnectionId getConnectionId()
• public Reason getReason()
– Además, la clase ConnectionClosedEvent sobrescribe el método toString de la clase
Object y contiene un único constructor que admite un objeto ConnectionId y un objeto
Reason como parámetro.
La clase ServerId
• Esta clase, que se encuentra en el paquete [Link],
contiene la identificación del servidor.
• Cada objeto ServerId contiene un objeto con la identificación de un cluster
(entiéndase como set de réplicas del servidor) asociado y uno con la
información de la dirección del servidor. Cada objeto puede ser obtenido con
uno de los siguientes métodos getter:
– public ClusterId getClusterId()
– public ServerAddress getServerAddress()
• Además, esta clase tiene un único constructor que admite como parámetros
un objeto ClusterId y uno ServerAddress. Ninguno de ellos pueden ser nulos.
• Además, esta clase sobrescribe los métodos equals, hashCode y toString de
la clase Object
La clase ClusterId
• Esta clase, que se encuentra en el paquete [Link], contiene la
identificación del cluster.
• Cada objeto ClusterId contiene un String con la descripción del cluster, que puede ser
null, y un String con el valor del cluster. Ambos Strings pueden ser obtenidos con los
siguientes métodos getter:
– public String getValue()
– public String getDescription()
• Además, esta clase tiene dos constructores. Ambos asignan automáticamente al valor
del cluster un String hexadecimal generado aleatoriamente a partir de un nuevo objeto
ObjectId:
– public ClusterId(String descripcion): Crea un objeto ClusterID con la descripción especificada
– public ClusterId(): Crea un objeto Cluster ID con una descripción nula.
• Además, esta clase sobrescribe los métodos equals, hashCode y toString de la clase
Object
La clase ServerAddress
• Esta clase, que se encuentra en el paquete
[Link], contiene la identificación de la
dirección del servidor.
• Cada objeto ServerAddress contiene un String con el host y
un entero con el puerto. Ambos valores pueden ser obtenidos
con los siguientes métodos getter:
– public String getHost()
– public int getPort()
• Además, esta clase sobrescribe los métodos equals,
hashCode y toString de la clase Object
La clase ServerAddress
• Además, esta clase tiene los siguientes constructores:
– public ServerAddress(): Crea un objeto ServerAddress haciendo referencia a la dirección
[Link]:27017
– public ServerAddress(String host): Crea un objeto ServerAddress haciendo referencia al host
especififcado, que puede ser expresado en IPv4 o IPv6 (RFC 2732). Si el host viene con un
puerto especificado, se usará ese puerto en lugar del puerto 27017.
– public ServerAddress([Link] ia, int port): Crea un objeto ServerAddress a partir
de la dirección de internet especificada en ia por el puerto especificado
– public ServerAddress(InetAddress ia): Equivale al constructor anterior pasando como
parámetros el objeto ia y el puerto 27017
– public ServerAddress([Link] isa): Crea un objeto ServerAddress a partir
del host y puerto encapsulados en el objeto isa.
– public ServerAddress(String host, int port): Crea un objeto ServerAddress a partir del host y
puerto especificados. Si se especificó un puerto en host y el valor de port es distinto de 27017,
se lanzará una excepción.
La clase ServerAddress
• Además, esta clase tiene los siguientes métodos:
– public InetSocketAddress getSocketAddress(): Permite obtener un objeto
InetSocketAddress a partir de la dirección DNS asociada al host y el
puerto. Si el host es desconocido, se lanzará una excepción.
– public List<InetSocketAddress> getSocketAddresses(): Igual que el
anterior, pero el valor devuelto es una lista conteniendo 1 objeto
InetSocketAddress por cada dirección de internet obtenida del host.
– public static String defaultHost(): Obtiene el host por defecto en caso de
no especificarse uno para un objeto ServerAddress. Corresponde a la
dirección IP de localhost ([Link])
– public static int getPort(): Obtiene el puerto por defecto, que es el 27017,
en caso de no especificarse uno para un objeto ServerAddress
La clase ConnectionId
• Esta clase, que se encuentra en el paquete [Link], contiene la
identificación de una conexión.
• Cada objeto ConnectionId contiene un objeto con la identificación del servidor, un número
entero con el valor local, y un objeto Integer con el valor del servidor. Cada valor puede ser
obtenido con uno de los siguientes métodos getter:
– public ServerId getServerId()
– public int getLocalValue()
– public Integer getServerValue()
• Además, esta clase tiene un único constructor que admite como parámetros un objeto
ServerId, un entero con el valor local y un Integer con el valor del servidor. El objeto serverId
no puede ser nulo.
• Además, esta clase sobrescribe los métodos equals, hashCode y toString de la clase Object
• Además, esta clase contiene el método public ConnectionId withServerValue(int sv) que
reemplaza el valor actual del servidor por el valor de sv y devuelve el objeto resultante. El
valor actual del servidor debe ser nulo o se lanzará una excepción.
La clase ServerSettings
• Esta clase, que se encuentra en el paquete [Link],
contiene la configuración de monitoreo del servidor.
• Cada objeto ServerAddress contiene una frecuencia de latidos actual y
una mínima, ambas en milisegundos, más una lista de oyentes de
eventos del servidor y del monitor del servidor. Estos valores pueden ser
obtenidos con los siguientes métodos getter:
– public long getHeartbeatFrequency(TimeUnit tu)
– public long getMinHeartbeatFrequency(TimeUnit tu)
– public List<ServerListener> getServerListeners()
– public List<ServerMonitorListener> getServerMonitorListeners()
• Además, esta clase sobrescribe los métodos equals, hashCode y toString
de la clase Object
La clase ServerSettings
• La clase no tiene constructores públicos, pero tiene una
clase interna llamada Builder, que puede ser obtenida
con el método public static [Link]
builder() y que permite crear un objeto ServerSettings con
el método public ServerSettings build()
La clase ServerSettings
• Antes de llamar a build(), se debe llamar a al menos uno de los siguientes métodos del
objeto Builder:
– public [Link] applySettings(ServerSettings ss) para establecer los valores
mencionados anteriormente desde un ServerSettings existente
– public [Link] heartbeatFrequency(long hf, TimeUnit tu)
– public [Link] minHeartbeatFrequency(long hf, TimeUnit tu)
– public [Link] addServerListener(ServerListener sl) para agregar un oyente de
servidor a la lista de oyentes
– public [Link] addServerMonitorListener(ServerMonitorListener sml) para agregar
un oyente de monitor de servidor a la lista de oyentes
– public [Link] serverListenerList(List<ServerListener> lsl): Sobrescribe la lista de
oyentes de servidor por la especificada en lsl
– public [Link] serverMonitorListenerList(List<ServerMonitorListener> lsml): Igual
que el anterior pero para los oyentes de monitor de servidores
– public [Link] applyConnectionString(ConnectionString cs): Establece el valor de la
frecuencia de latidos desde el campo heartbeatFrequency de la query string de la URL de
conexión.
La interfaz ServerListener
• Por defecto, cuando ocurre un evento relacionado con el servidor, no ocurre nada
adicional.
• Sin embargo, usted puede ejecutar una acción adicional creando una clase que sea
extensión de la interfaz ServerListener, ubicada en el paquete [Link] y
luego, en esa clase, sobrescribir al menos un método de la interfaz.
• No es necesario sobrescribir todos los métodos, ya que estos fueron definidos como
métodos por defecto en la interfaz.
• Todos los métodos son de tipo void y aceptan un único parámetro que es una instancia
de una clase de evento, dependiendo del método a sobrescribir.
• No es necesario crear una instancia de las clases a las que pertenecen los argumentos
de cada método en la interfaz, debido a que los métodos son invocados
automáticamente y los parámetros son generados automáticamente en el proceso.
La interfaz ServerListener: métodos
• default void serverOpening(ServerOpeningEvent ev) y
default void serverClosed(ServerClosedEvent ev): métodos
invocados automáticamente cuando, respectivamente, se
abre o se cierra un servidor
– Las instancias de las clases ServerOpeningEvent y
ServerClosedEvent cuentan con la id del servidor que se abrió, el
cual puede obtenerse con el método public ServerId getServerId()
– Además, ambas clases tienen un único constructor que admite un
objeto ServerId como parámetro y sobrescriben el método
toString de la clase Object.
La interfaz ServerListener: métodos
• default void
serverDescriptionChanged(ServerDescriptionChangedEvent ev):
método invocado automáticamente cuando se cambia la descripción
de un servidor
– Las instancias de la clase ServerDescriptionChangedEvent cuenta con la id del
servidor que se abrió, la descripción antigua y la nueva, las cuales se pueden
obtener con los siguientes métodos:
• public ServerId getServerId()
• public ServerDescription getPreviousDescription()
• public ServerDescription getNewDescription()
– Además, esa clase tiene un único constructor que admite un objeto ServerId y 2
objetos ServerDescription como parámetro (el primero para la nueva descripción
y el segundo para la antigua) como parámetro y sobrescribe el método toString
de la clase Object.
La clase ServerDescription
• Esta clase, ubicada en el paquete [Link],
contiene la descripción detallada de un servidor.
• La clase no tiene constructores públicos, pero tiene una clase
interna llamada Builder, que puede obtenerse con el método
estático public [Link] builder()
• Desde el Builder se puede llamar a uno o varios métodos
para asignar partes de la descripción y luego crear el objeto
ServerDescription resultante con el método public
ServerDescription build().
La clase ServerDescription
• Además de build(), la clase [Link] cuenta
con los siguientes métodos:
– public [Link] address(ServerAddress sa):
Establece la dirección del servidor descrito.
– public [Link] cannonicalAddress(String ca):
Establece la dirección canónica del servidor descrito.
– public [Link] type(ServerType st): Establece el
tipo de servidor.
• Si no se llama a este método antes de llamar a build(), el objeto
ServerDescription resultante indicará que el tipo de servidor es
[Link]
La clase ServerDescription
• Además de build(), la clase [Link]
cuenta con los siguientes métodos:
– public [Link] hosts(Set<String> hs):
Establece un set inmodificable de hosts.
• El set puede ser nulo
• Cada String en el set debe tener formato “host:puerto” (“:puerto” se
puede omitir)
• Aplicable para un tipo de servidor que constituya un set de réplica y
que no sea ServerType.REPLICA_SET_OTHER ni
ServerType.REPLICA_SET_ARBITER
La clase ServerDescription
• Además de build(), la clase [Link]
cuenta con los siguientes métodos:
– public [Link] passives(Set<String> hs):
Establece un set de hosts pasivos, es decir, con prioridad cero.
• El set puede ser nulo
• Cada String en el set debe tener formato “host:puerto” (“:puerto” se
puede omitir)
• Aplicable para el tipo de servidor ServerType.REPLICA_SET_OTHER
La clase ServerDescription
• Además de build(), la clase [Link]
cuenta con los siguientes métodos:
– public [Link] arbiters(Set<String> hs):
Establece un set de hosts arbitrales.
• El set puede ser nulo
• Cada String en el set debe tener formato “host:puerto” (“:puerto” se
puede omitir)
• Aplicable para el tipo de servidor
ServerType.REPLICA_SET_ARBITER
La clase ServerDescription
• Además de build(), la clase [Link]
cuenta con los siguientes métodos:
– public [Link] primary(String hs): Establece un
hosts primario en formato “host:puerto” (“:puerto” se puede omitir)
• El host puede ser nulo
• Aplicable para el tipo de servidor ServerType.REPLICA_SET_PRIMARY
– public [Link] maxDocumentSize(int mds):
Establece el tamaño máximo que debe tener un documento
• Si no se llama a este método antes de llamar a build(), el objeto
ServerDescription resultante indicará que el largo máximo será el número
hexadecimal 1000000, es decir, 16 MB.
La clase ServerDescription
• Además de build(), la clase [Link] cuenta
con los siguientes métodos:
– public [Link] tagSet(TagSet ts): Establece un set
con todos los tags para el servidor.
– public [Link] roundTripTime(long rtt, TimeUnit
tu): Establece el tiempo transcurrido aproximado para solicitar la
descripción desde el servidor, convirtiéndolo desde la unidad de
tiempo especificada en tu hasta milisegundos.
– public [Link] setName(String sn): Establece el
nombre del set de réplica. Aplicable si el tipo de servidor constituye
un set de réplica.
La clase ServerDescription
• Además de build(), la clase [Link]
cuenta con los siguientes métodos:
– public [Link] ok(boolean ok): Establece si la
solicitud de la descripción del servidor fue exitosa, en cuyo caso,
su valor debe ser true.
– public [Link] state(ServerConnectionState
scs): Establece el estado de conexión del servidor.
• ServerConnectionState, en el paquete [Link] es una
enumeración que define 2 constantes: CONNECTING (activamente
intentando establecer conexión) y CONNECTED (conectado
exitosamente)
La clase ServerDescription
• Además de build(), la clase [Link] cuenta con los
siguientes métodos:
– public [Link] minWireVersion(int mwv): Establece la versión
mínima requerida del protocolo de comunicación entre el servidor MongoDB y un
cliente.
• Si no se llama a este método antes de llamar a build(), se asume un 0
– public [Link] maxWireVersion(int mwv): Igual que el anterior,
pero para la versión máxima.
• Si no se llama a este método antes de llamar a build(), se asume un 0
– public [Link] electionId(ObjectId eid): Establece la id de
elección reportada por el servidor.
– public [Link] setVersion(Integer sv): Establece la versión de
set reportada por el servidor.
La clase ServerDescription
• Además de build(), la clase [Link] cuenta con los
siguientes métodos:
– public [Link] topologyVersion(TopologyVersion tv): Establece
la versión de topología reportada por el servidor.
– public [Link] lastWriteDate(Date lastWriteDate): Establece la
fecha de la escritura más reciente
– public [Link] lastUpdateTimeNanos(long
lastUpdateTimeNanos): Establece el tiempo, en nanosegundos, desde la última
actualización.
– public [Link] logicalSessionTimeoutMinutes(Integer mins):
Establece el timeout de la sesión en minutos. El objeto mins puede ser nulo.
– public [Link] exception(Throwable e): Establece la excepción
lanzada al tratar de determinar la descripción del servidor
La clase ServerDescription
• Además, ServerDescription define las siguientes constantes:
– public static final String MIN_DRIVER_SERVER_VERSION: Versión mínima soportada del
servidor de driver. Su valor es “3.6” para las versiones 4.8.x y 4.9.x del driver de mongodb y
“2.6” para versiones anteriores a esas.
– public static final int MIN_DRIVER_WIRE_VERSION: Versión mínima soportada del protocolo
de comunicación entre el servidor MongoDB y un cliente.. Su valor es 6 para las versiones
4.8.x y 4.9.x del driver de mongodb y 2 para versiones anteriores a esas.
– public static final int MAX_DRIVER_WIRE_VERSION: Versión máxima soportada del
protocolo de comunicación entre el servidor MongoDB y un cliente.. Su valor depende de la
versión del driver de mongodb utilizada en su aplicación:
• 4.0.x: 8
• 4.1.x y 4.2.x: 9
• 4.3.x: 13
• 4.4.x: 14
• 4.5.x y 4.6.x: 15
• 4.7.x, 4.8.x y 4.9.x: 17
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription cuenta con los siguinetes
métodos:
– public boolean isOk(): Devuelve el valor de la bandera ok que fue seteado via el Builder
de ServerDescription
– public int getMinWireVersion(): Devuelve el valor de la mínima versión del “alambre” de
driver que fue seteado via el Builder de ServerDescription
– public int getMaxWireVersion(): Devuelve el valor de la máxima versión del “alambre” de
driver que fue seteado via el Builder de ServerDescription
– public boolean isCompatibleWithDriver(): Devuelve true si el servidor es compatible con
el driver. El servidor se considera compatible con el driver si ocurre uno, y solo uno, de
los siguientes casos:
• El tipo del servidor es ServerType.LOAD_BALANCER
• El valor devuelto por isOk() es true y:
– El valor devuelto por getMinWireVersion() es mayor que la constante MAX_DRIVER_WIRE_VERSION o
– El valor devuelto por getMaxWireVersion() es menor que la constante MIN_DRIVER_WIRE_VERSION
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription
cuenta con los siguinetes métodos:
– public static int getDefaultMaxDocumentSize(): Devuelve el
número hexadecimal 1000000, que corresponde a 16 MB, el
tamaño máximo por defecto de los documentos.
– public static int getDefaultMinWireVersion(): Devuelve un 0,
que es el valor por defecto para la versión mínima del protocolo
de conexión entre un servidor MongoDB y un cliente.
– public static int getDefaultMinWireVersion(): Igual que el
anterior, pero para la versión máxima.
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription cuenta con los siguinetes
métodos:
– public boolean isReplicaSetMember(): Devuelve true si el tipo del servidor constituye un set de
réplica
– public boolean isShardRouter(): Devuelve true si el tipo del servidor es
ServerType.SHARD_ROUTER
– public boolean isStandAlone(): Devuelve true si el tipo del servidor es [Link]
– public boolean isPrimary(): Devuelve true si el valor devuelto por isOk() es true y el tipo de servidor
constituye un servidor primario
• El tipo de servidor ServerType.REPLICA_SET_PRIMARY se considera primario,
• Los tipos de servidor ServerType.SHARD_ROUTER, [Link] y
ServerType.LOAD_BALANCER pueden ser primarios y/o secundarios
– public boolean isSecondary(): Devuelve true si el valor devuelto por isOk() es true y el tipo de
servidor es ServerType.REPLICA_SET_SECONDARY o cualquiera de los listados en el método
anterior excepto ServerType.REPLICA_SET_PRIMARY.
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription
cuenta con los siguinetes métodos:
– public Set<String> getHosts(): Obtiene la lista de hosts seteada
desde el Builder que no sean pasivos ni ocultos ni arbitrales.
– public Set<String> getPassives(): Obtiene la lista de hosts
pasivos seteada desde el Builder
– public Set<String> getArbiters(): Obtiene la lista de hosts
arbitrales seteada desde el Builder.
– public String getPrimary(): Obtiene el actual host primario
seteado desde el Builder.
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription cuenta
con los siguinetes métodos:
– public int getMaxDocumentSize(): Obtiene el tamaño máximo de
documentos seteado desde el Builder.
– public TagSet getTagSet(): Obtiene el set de tags seteado desde el
Builder
– public int getMinWireVersion(): Obtiene la versión mínima, seteada
desde el Builder, del protocolo de conexión entre un servidor y un
cliente.
– public int getMaxWireVersion(): Igual que el anterior, pero para la
versión máxima.
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription
cuenta con los siguinetes métodos:
– public ObjectId getElectionId(): Obtiene el ID de elección
seteado desde el Builder. Puede ser nulo.
– public Integer getSetVersion(): Obtiene la versión de set
seteada desde el Builder. Puede ser nula.
– public TopologyVersion getTopologyVersion(): Obtiene la
versión de topología seteada desde el Builder.
– public Date getLastWriteDate(): Obtiene la fecha seteada
desde el Builder para la escritura más reciente.
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription cuenta
con los siguinetes métodos:
– public long getLastUpdateTime(TimeUnit tu): Obtiene el tiempo de la
última actualización expresado en la unidad de tiempo especificada.
– public boolean hasTags(TagSet desired): Devuelve true si la
descripción del servidor contiene todos los tags deseados.
• Si isOk() devuelve false, entonces hasTags devuelve false sin importar el
contenido de los tags
• Si el tipo de servidor es [Link] o
ServerType.SHARD_ROUTER, entonces hasTags devuelve true sin importar
el contenido de los tags.
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription
cuenta con los siguinetes métodos:
– public String getSetName(): Devuelve el nombre del set de
réplica que fue seteado en el Builder.
– public ServerConnectionState getState(): Devuelve el estado
de conexión del servidor que fue seteado en el Builder
– public long getRoundTripTimeNanos(): Devuelve el tiempo,
seteado en nanosegundos en el Builder, para ser el viaje
completo para solicitar la información desde el servidor
La clase ServerDescription
• Además de la clase interna Builder, ServerDescription
cuenta con los siguientes métodos:
– public Throwable getException(): Obtiene la excepción seteada
desde el Builder. Puede ser nula.
– public String getShortDescription(): Obtiene una representación
corta y elegante de la descripción del servidor.
• Para una representación detallada, use el método toString()
• Además, ServerDescription sobrescribe los métodos
equals, hashCode y toString de la clase Object.
La enumeración ServerType
• Esta enumeración, en el paquete [Link] es una
enumeración que define las siguientes constantes:
– STANDALONE (servidor original),
– REPLICA_SET_PRIMARY (miembro primario de un set de réplicas),
– REPLICA_SET_SECONDARY (miembro secundario de un set de réplicas),
– REPLICA_SET_ARBITER (miembro arbitral de un set de réplicas),
– REPLICA_SET_OTHER (miembro no especificado de un set de réplica),
– REPLICA_SET_GHOST (miembro de un set de réplicas que no reporta un
nombre de set o una lista de hosts),
– SHARD_ROUTER (Enrutador a un servidor Mongos),
– LOAD_BALANCER (balanceador de carga),
– UNKNOWN (desconocido)
La clase TagSet
• Esta clase, perteneciente al paquete [Link], contiene una lista
interna inmutable de tags de un set de réplicas usado para operaciones de
lectura.
• La clase implementa la interfaz [Link]<Set> para permitir recorrer
la lista interna usando un for a modo de foreach. En consecuencia, cuenta
con su propia implementación del método public [Link]<Tag>
iterator()
• La clase contiene 3 constructores:
– public TagSet(): Crea un set vacío de tags.
– public TagSet(Tag tag): Crea un set con un tag inicial. El objeto tag no debe ser nulo
o se lanzará una excepción.
– public TagSet(List<Tag> tagl): Crea un set con todos los tags de la lista tagl.
• Se lanzará una excepción si la lista es nula o al menos un elemento en ella es nula o si existen
dos o más tags con el mismo nombre.
• Todos los tags agregados son ordenados por el nombre de cada uno.
La clase TagSet
• Además, esta clase contiene el método public boolean
containsAll(TagSet ts), que devuelve true si todos los
tags en ts existen en “este” TagSet.
• Además, esta clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase Tag
• Esta clase, ubicada en el paquete [Link], contiene el
nombre y valor de un tag, los cuales pueden ser obtenidos
con los siguientes métodos getter:
– public String getName()
– public String getValue()
• Además, la clase cuenta con un único constructor que admite
2 Strings como parámetro (el primero para el nombre y el
segundo para el valor)
• Además, la clase sobrescribe los métodos equals, hashCode
y toString de la clase Object.
La clase TopologyVersion
• Esta clase, ubicada en el paquete [Link], contiene una versión de
topología, que consiste en un ID de proceso y un contador numérico, los cuales pueden ser
obtenidos con los siguientes métodos getter:
– public ObjectId getProcessId()
– public long getCounter()
• Además, la clase cuenta con los siguientes constructores:
– public TopologyVersion(ObjectId pid, long c) para establecer el id de proceso y el contador directamente
– public TopologyVersion(BsonDocument bdoc) para establecer el id de proceso y el contador
encapsulados en bdoc.
• El documento debe tener los campos con claves processId y counter.
• El valor para processId debe ser un BsonObjectId
• El valor para counter debe ser un BsonInt64
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la clase Object.
• La clase también cuenta con el método public BsonDocument asDocument() para obtener
una representación del id de proceso y el contador, como un BsonInt64 dentro de un
documento BSON.
La interfaz ServerMonitorListener
• Por defecto, cuando ocurre un evento relacionado con el monitor de un servidor, no
ocurre nada adicional.
• Sin embargo, usted puede ejecutar una acción adicional creando una clase que sea
extensión de la interfaz ServerMonitorListener, ubicada en el paquete
[Link] y luego, en esa clase, sobrescribir al menos un método de la
interfaz.
• No es necesario sobrescribir todos los métodos, ya que estos fueron definidos como
métodos por defecto en la interfaz.
• Todos los métodos son de tipo void y aceptan un único parámetro que es una instancia
de una clase de evento, dependiendo del método a sobrescribir.
• No es necesario crear una instancia de las clases a las que pertenecen los argumentos
de cada método en la interfaz, debido a que los métodos son invocados
automáticamente y los parámetros son generados automáticamente en el proceso con
sus miembros seteados automáticamente.
La interfaz ServerMonitorListener: métodos
• default void
serverHeartbeatStarted(ServerHeartbeatStartedEvent ev):
método llamado automáticamente cuando compienza un “latido”
en el servidor
– Las instancias de la clase ServerHeartbeatStartedEvent contienen un
objeto ConnectionId interno que puede obtenerse con el método public
ConnectionId getConnectionId()
– Esa clase tiene un único constructor que admite un objeto
ConnectionId como parámetro para asignarlo al nuevo objeto
• El parámetro no puede ser nulo
– Además, esa clase sobrescribe el método toString de la clase Object
La interfaz ServerMonitorListener: métodos
• default void serverHeartbeatSucceded(ServerHeartbeatSucceededEvent ev): método
llamado automáticamente cuando un “latido” termina exitosamente en el servidor
– Las instancias de la clase ServerHeartbeatSuccededEvent contienen el identificador de una
conexión, un documento con la respuesta al latido, el tiempo transcurrido en nanosegundos y
una bandera para indicar si el “latido” se dejó en espera. Estos miembros pueden obtenerse
con los siguientes métodos getter:
• public ConnectionId getConnectionId()
• public BsonDocument getReply()
• public long getElapsedTime(TimeUnit tu) (especificar la unidad de tiempo)
• public boolean isAwaited()
– Esa clase tiene un único constructor que admite un objeto ConnectionId, uno BsonDocument,
un long y un booleano como parámetros para asignarlos al nuevo objeto
• El objeto ConnectionId y el objeto BsonDocument no pueden ser nulos
• El parámetro de tipo long no puede ser negativo.
– Además, esa clase sobrescribe el método toString de la clase Object
La interfaz ServerMonitorListener: métodos
• default void serverHeartbeatFailed(ServerHeartbeatFailedEvent ev):
método llamado automáticamente cuando un “latido” termina en falla
debido a una excepción
– La clase ServerHeartbeatFailedEvent tiene los mismos miembros que la clase
ServerHeartbeatSucceededEvent (junto con sus métodos getter) excepto el
documento con la respuesta, que es reemplazado por la excepción lanzada, que
puede ser obtenida con el método public Throwable getThrowable()
– Esa clase tiene un único constructor que admite un objeto ConnectionId, uno
Throwable, un long y un booleano como parámetros para asignarlos al nuevo
objeto
• El objeto ConnectionId y el objeto Throwable no pueden ser nulos
• El parámetro de tipo long no puede ser negativo.
– Además, esa clase sobrescribe el método toString de la clase Object
La clase SSLSettings
• Esta clase, ubicada en el paquete [Link], contiene la
configuración de uso del protocolo SSL para conexiones seguras desde
un cliente a un servidor
• La clase no tiene constructores públicos, pero tiene una clase interna
llamada Builder para crear objetos mediante su método public
SSLSettings build().
• Para crear un objeto [Link], la clase SSLSettings
proporciona 2 métodos estáticos:
– public [Link] builder(): Crea un objeto [Link] con la
configuración por defecto
– public [Link] builder(SSLSettings sl): Crea un objeto
[Link] con la configuración especificada en sl.
La clase SSLSettings
• Además del método build(), la clase [Link] proporciona los
siguientes métodos:
– public [Link] applySettings(SSLSettings ss): Este método asigna al objeto
que será creado con build la configuración establecida en ss.
• El objeto ss no puede ser nulo.
– public [Link] enabled(boolean enabled): Establece si la conexión SSL está
habilitada, en cuyo caso el valor de enabled debe ser true.
– public [Link] invalidHostNameAllowed(boolean ihna): Establece si la
conexión ssl permite hosts inválidos, en cuyo caso el valor de ihna debe ser true.
– public [Link] context([Link] ctx): Establece el contexto a
usar para conexiones cuando SSL está habilitado.
• Consulte la documentación acerca de la clase SSLContext.
– public [Link] applyConnectionString(ConnectionString cs): Establece si la
conexión SSL está habilitada en base al valor devuelto por el método [Link]()
La clase SSLSettings
• Los miembros seteados desde el Builder con el método
build pueden ser obtenidos del objeto creado con los
siguientes métodos getter:
– public boolean isEnabled()
– public boolean isInvalidHostNameAllowed()
– public SSLContext getContext()
• Además, la clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase MongoClients
• Esta clase, ubicada en el paquete [Link], es
la encargada de establecer conexión entre un programa en
JAVA con un servidor MongoDB
• Para ello, proporciona todas sus sobrecargas del método
create. Todas ellas, en caso de éxito, devuelven un objeto
MongoClient que será utilizado para la interacción con las
bases de datos
• La conexión puede fallar si no hay un servidor MongoDB en
la dirección especificada o si las credenciales son inválidas.
La clase MongoClients: métodos
• public static MongoClient create(): Establece conexión con el servidor local (localhost)
• public static MongoClient create(MongoClientSettings mcs): Establece conexión con la
dirección y credenciales especificadas en el objeto mcs.
• public static MongoClient create(String cs): Establece conexión con el servidor
especificado en la dirección cs, asumiendo que las credenciales están especificadas allí.
• public static MongoClient create(ConnectionString cs): Establece conexión con el
servidor especificado en el objeto cs, asumiendo que las credenciales están
especificadas allí.
• public static MongoClient create(ConnectionString cs, MongoDriverInformation mdi):
Establece conexión con el servidor especificado en cs, especificando también
información acerca del driver. El objeto mdi puede ser nulo.
• public static MongoClient create(MoncoClientSettings mcs, MongoDriverInformation
mdi): Establece conexión con la configuración especificada en cs, especificando
también información acerca del driver. El objeto mdi puede ser nulo.
La clase MongoDriverInformation
• Esta clase, ubicada en el paquete [Link], contiene la
información del driver de conexión
• No tiene constructores públicos, pero contiene una clase interna
llamada Builder para crear un nuevo objeto, el cual puede obtenerse
llamando al método public MongoDriverInformation build()
• El objeto Builder puede obtenerse llamando a uno de los siguientes
métodos:
– public [Link] builder(): Crea un objeto Builder
con la configuración por defecto
– public [Link] builder(MongoDriverInformation
mdi): Crea un objeto Builder con la configuración especificada en mdi
La clase MongoDriverInformation
• Además del método build(), la clase
[Link] contiene los siguientes
métodos:
– public [Link] driverName(String dn):
Establece el nombre del driver. No puede ser nulo.
– public [Link] driverVersion(String dv):
Establece la versión del driver. No puede ser nulo.
– public [Link] driverPlatform(String dp):
Establece la plataforma soportada por el driver. No puede ser
nula.
La clase MongoDriverInformation
• Desde el objeto MongoDriverInformation creado, se puede obtener todos los
nombres, versiones y plataformas con los siguientes métodos getter:
– public List<String> getDriverNames()
– public List<String> getDriverVersions()
– public List<String> getDriverPlatforms()
• Si se crea un objeto Builder sin pasarle un parámetro, al momento de llamar
a build(), el objeto creado tendrá una lista de nombres, una de versiones y
una de plataformas con exactamente un elemento cada una.
• Si se crea un objeto Builder pasándole un objeto MongoDriverInformation, el
objeto creado tendrá la lista de nombres, la de versiones y la de plataformas
del objeto recibido, más el nuevo nombre, la nueva versión y la nueva
plataforma, cada uno agregados al principio de su correspondiente lista.
Operaciones CRUD entre JAVA y MongoDB
Introducción
• Una vez establecida con éxito la conexión con el servidor,
se obtendrá un objeto MongoClient, el cual será utilizado
para interacciones con las bases de datos alojadas en el
host del servidor.
• Antes de ver las operaciones CRUD, primero veamos
qué se puede hacer directamente con el objeto
MongoClient
Consideraciones acerca de MongoClient
• MongoClient es una interfaz.
• Las clases que la implementan son clases internas del núcleo
del driver de MongoDB y son insignificantes para este
documento.
• MongoClient es una extensión de la interfaz [Link],
la cual a su vez es extensión de la interfaz
[Link], por lo que:
– Hereda el método close() de ambas interfaces para cerrar la
conexión
– Se puede y se recomienda usar un try con recursos para trabajar
con el objeto MongoClient creado.
Métodos propios de MongoClient
• public ClientSession startSession(): Crea un obheto sde
sesión de usuario para ser usado en transacciones.
 Véase la sección Transacciones para más detalles
Métodos propios de MongoClient
• public MongoIterable<String> listDatabaseNames(): Devuelve
una lista con los nombres de todas las bases de datos en el
host.
• public MongoIterable<String>
listDatabaseNames(ClientSession cs): Igual al anterior, pero
solo aquellas bases de datos asociadas a la sesión de cliente
especificada.
• public ListDatabasesIterable<Document> listDatabases():
Devuelve en una lista, por cada base de datos en el host, un
documento con información de la base de datos.
Métodos propios de MongoClient
• public ListDatabasesIterable<T> listDatabases(ClientSession cs): Igual al
anterior, pero solo bases de datos asociadas a la sesión de cliente
especificada.
• public ListDatabasesIterable<T> listDatabases(Class<T> resClass):
Devuelve en una lista, por cada base de datos en el host, información de la
base de datos que será guardada, si es posible, en instancias de T en vez
de la clase Document.
• public ListDatabasesIterable<T> listDatabases(ClientSession cs, Class<T>
resClass): Igual al anterior, pero solo bases de datos asociadas a la sesión
de cliente especificada.
• public MongoDatabase getDatabase(String dbn): Obtiene un objeto
MongoDatabase para el uso de la base de datos especificada por su nombre.
La interfaz MongoIterable<T>
• Esta interfaz, que pertenece al paquete [Link],
debe ser implementado por colecciones de objetos que sean
resultados de operaciones tales como resultas.
• MongoDB proporciona clases que implementan la interfaz. Dichas
clases son insignificantes para este documento.
• La interfaz es una extensión de la interfaz Iterable<T>, por lo que:
– Sobrescribe el método iterator() para que devuelva un objeto
MongoCursor<T>
– El contenido de un MongoIterable puede ser recorrido usando un ciclo
for a modo de foreach.
La interfaz MongoIterable<T>: métodos propios
• public T first(): Devuelve el primer elemento en el iterador, a
menos que el iterador esté vacío, en cuyo caso se devuelve
null.
• public MongoIterable<U> map(Function<T, U> mapper): Utiliza
el objetoMapper para que, a partir de cada instancia de T en
“este” iterador, se agrega a un nuevo iterador una instancia de
U. Luego se devuelve el iterador creado.
– La interfaz Function<T, U>, perteneciente al paquete [Link], es
una interfaz funcional que contiene un único método llamado public U
apply(T t), por lo que se puede usar una expresión lambda como
argumento de map (Ejemplo: [Link](t -> crearU(t))
La interfaz MongoIterable<T>: métodos propios

• public [Link]<T> into(Collection<T> trg):


Agrega todos los elementos del iterador en la colección trg
en el orden dado.
– El argumento de into y el objeto al cual asignar el valor devuelto
del método debe ser cualquier clase que implemente la interfaz
Collection<T> o cualquier interfaz que sea extensión de ella.
• public MongoIterable<T> batchSize(int bs): Crea un nuevo
iterador a partir de “este”, asignando el número de
documentos a devolver por cada batch.
La interfaz MongoCursor<T>
• Esta interfaz, perteneciente al paquete [Link], debe ser
implementada por cualquier clase que se desee utilizar como cursor.
• Al ser una extensión de la interfaz [Link]<T>, implementa los
dos métodos de esa interfaz para recorrer el cursor:
– public boolean hasNext()
– public T next()
• Además, MongoCursor<T> también es una extensión de la interfaz
Closeable, por lo que:
– Hereda el método close()
– Objetos que son instancias de MongoCursor<T> pueden ser declarados
dentro de un try con recursos.
La interfaz MongoCursor<T>: metodos propios
• public int available(): Devuelve la cantidad de resultados
disponible localmente sin bloqueos. Puede ser 0.
• public T tryNext(): Intenta devolver el próximo resultado del cursor.
Si no hay un próximo resultado, en vez de eso, devuelve null.
• public ServerCursor getServerCursor(): Devuelve un objeto
ServerCursor con la información del cursor en el servidor. Puede
ser null si no se creó un cursor en el servidor o si el cursor fue
agotado o asesinado.
• public ServerAddress getServerAddress(): Obtiene la dirección
del servidor donde se creó el cursor.
La clase ServerCursor
• Esta clase, que está en el paquete [Link], contiene la información de un
cursor en el servidor, que consiste en una id numérica y una dirección, que
pueden obtenerse con los siguientes métodos getter:
– public long getId()
– public ServerAddress getServerAddress()
• La clase tiene un único constructor que admite como parámetros un número
long y un objeto ServerAddress para asignar valores al nuevo objeto
– El número long no debe ser 0 o se lanzará una excepción
• La clase sobrescribe los métodos equals, hashCode y toString de la clase
Object
• Además, la clase fue declarada como final (no puede haber clases que sean
extensiones de esta) y serializable (implementa la interfaz [Link])
La interfaz ListDatabasesIterable<T>
• Esta interfaz, del paquete [Link], es una
extensión de MongoIterable<T> dedicada exclusivamente
al listado de bases de datos en un servidor.
• De todos los métodos definidos en MongoIterable<T>,
solo se sobrescribe el método batchSize para que
devuelva un objeto ListDatabasesIterable
La interfaz ListDatabasesIterable<T>: métodos
propios
• public ListDatabasesIterable<T> maxTime(long maxTime, TimeUnit tu): Crea un nuevo
iterador con un tiempo máximo de ejecución en el servidor expresado en la unidad de
tiempo especificada.
• public ListDatabasesIterable<T> filter(Bson b): Aplica el filtro especificado en b a la lista
de bases de datos y devuelve el iterador resultante.
– El objeto b puede ser nulo
– Ejemplos de clases que implementan la interfaz Bson son Document y BsonDocument
• public ListDatabasesIterable<T> nameOnly(Boolean nonl): Crea un nuevo iterador
conteniendo solo los nombres de la base de datos si nonl es [Link], o los
nombres y el tamaño de cada una si nonl es [Link]
– El objeto nonl puede ser nulo. El programador debe decidir qué hacer en esos casos.
• public ListDatabasesIterable<T> authorizedDatabasesOnly(Boolean auth): Crea un
nuevo iterador conteniendo solo las bases de datos que el usuario actual está
autorizado a ver.
– El objeto auth puede ser nulo. El programador debe decidir qué hacer en esos casos.
La interfaz ListDatabasesIterable<T>: métodos
propios
• public ListDatabasesIterable<T> comment(String c): Crea
un nuevo iterador asignando un comentario String a la
operación.
– El string c puede ser nulo
• public ListDatabasesIterable<T> comment(BsonValue
bv): Igual que el anterior pero con el comentario
encapsulado en el objeto bv, que también puede ser nulo.
La interfaz MongoDatabase
• Una vez establecida la conexión y encontrada la base de datos deseada,
hay que indicar que se utilizará esa base de datos para operaciones
CRUD.
• Para ello, desde el objeto MongoClient creado se debe llamar al método
getDatabase(String dbn) especificando el nombre de la base de datos
(dbn).
• El método getDatabase devuelve un objeto MongoDatabase para hacer
referencia a la base de datos deseada.
• MongoDatabase es una interfaz perteneciente al paquete
[Link], cuya(s) implementación(es) es(son) proporcionadas
por el driver de MongoDB y es(son) insignificante(s) para el programador.
La interfaz MongoDatabase
• Con un objeto MongoDatabase se puede hacer lo siguiente:
– Listar colecciones existentes actualmente en la base de datos:
• public MongoIterable<String> listCollectionNames() para los nombres de las colecciones
• public MongoIterable<String> listCollectionNames(ClientSession cs): Igual al anterior,
pero solo aquellas colecciones asociadas a la sesión de cliente especificada.
• public ListCollectionsIterable<Document> listCollections() para la información completa de
cada colección
• public ListCollectionsIterable<Document> listCollections(ClientSession cs): Igual al
anterior, pero solo aquellas colecciones asociadas a la sesión de cliente especificada.
• public ListCollectionsIterable<T> listCollections(Class<T> resClass): Igual que el anterior,
pero representando la información de cada colección con una instancia de una clase T en
vez de una de Document
• public ListCollectionsIterable<T> listCollections(ClientSession cs, Class<T> resClass):
Igual que el anterior, pero solo aquellas colecciones asociadas a la sesión de cliente
especificada.
La interfaz MongoDatabase
• Con un objeto MongoDatabase se puede hacer lo
siguiente:
– Crear colecciones:
• public void createCollection(String name): Crea una colección vacía con
el nombre especificado
• public void createCollection(ClientSession cs, String name): Igual al
anterior, pero asociando la operación a la sesión de cliente especificada.
• public void createCollection(String name, CreateCollectionOptions opts):
Igual que createCollection(name), pero especificando opciones especiales
para crear la colección.
• public void createCollection(ClientSession cs, String name,
CreateCollectionOptions opts): Igual al anterior, pero asociando la
operación a la sesión de cliente especificada.
La interfaz MongoDatabase
• Con un objeto MongoDatabase se puede hacer lo siguiente:
– Crear vistas:
• public void createView(String name, String onCol, List<? extends Bson> pipeline): Crea
una vista con el nombre name sobre la colección o vista onCol utilizando una lista de
etapas (pipeline).
– Cada elemento en pipeline debe ser un instancia de Bson o de cualquier clase que sea extensión de
ella como Document o BsonDocument.
• public void createView(ClientSession cs, String name, String onCol, List<? extends Bson>
pipeline): Igual al anterior, pero asociando la operación a la sesión de cliente especificada.
• public void createView(String name, String onCol, List<? extends Bson> pipeline,
CreateViewOptions opts): Igual que createView(name, onCol, pipeline), pero
especificando opciones especiales al momento de crear la vista.
• public void createView(ClientSession cs, String name, String onCol, List<? extends Bson>
pipeline, CreateViewOptions opts): Igual al anterior, pero asociando la operación a la
sesión de cliente especificada.
La interfaz MongoDatabase
• Con un objeto MongoDatabase se puede hacer lo
siguiente:
– Obtener una colección:
• public MongoCollection<Document> getCollection(String cn): Obtiene
una colección con el nombre especificado en la base de datos
• public MongoCollection<T> getCollection(String cn, Class<T>
docClass): Igual que el anterior, pero especificando que cada
documento debe estar guardado en una instancia de una clase T en
vez de una de Document.
La interfaz MongoDatabase
• Con un objeto MongoDatabase se puede hacer lo siguiente:
– Ejecutar un comando:
• public Document runCommand(Bson command): Ejecuta el comando
especificado. El parámetro debe ser una extensión de Bson, como Document o
BsonDocument.
• public Document runCommand(ClientSession cs, Bson command): Igual al
anterior, pero asociando la operación a la sesión de cliente especificada.
• public T runCommand(Bson command, Class<T> resClass): Igual que el anterior,
pero devolviendo el resultado del comando en una instancia de T en vez de una
de Document.
• public T runCommand(ClientSession cs, Bson command, Class<T> resClass):
Igual que el anterior, pero asociando la operación a la sesión de cliente
especificada.
La interfaz MongoDatabase
• Con un objeto MongoDatabase se puede hacer lo
siguiente:
– Eliminar la base de datos:
• public void drop()
• public void drop(ClientSession cs): Igual al anterior, pero asociando la
operación a la sesión de cliente especificada.
La clase CreateCollectionOptions
• Esta clase, ubicada en el paquete
[Link] pertmite establecer opciones
de creación de colecciones.
• La clase tiene un único constructor, que es el constructor
por defecto
• La clase además sobrescribe el método toString de la
clase Object.
La clase CreateCollectionOptions
• En vez de tener métodos setter convencionales para establecer
las opciones, la clase cuenta con métodos que devuelven
instancias de CreateCollectionOptions para permitir seteos “en
cadena”:
– public CreateCollectionOptions maxDocuments(long md): Establece la
cantidad máxima de documentos.
– public CreateCollectionOptions capped(boolean c): Establece si la
colección es “capped”.
– public CreateCollectionOptions sizeInBytes(long s): Establese el
tamaño máximo en bytes de la colección. Aplicable solo si se desea
que la nueva colección sea marcada como “capped”.
La clase CreateCollectionOptions
• En vez de tener métodos setter convencionales para
establecer las opciones, la clase cuenta con métodos que
devuelven instancias de CreateCollectionOptions para
permitir seteos “en cadena”:
– public CreateCollectionOptions
validationOptions(ValidationOptions opts): Establece opciones
de validación sobre los documentos que se inserten o
actualicen en la colección.
• El objeto opts no puede ser nulo
La clase CreateCollectionOptions
• En vez de tener métodos setter convencionales para establecer
las opciones, la clase cuenta con métodos que devuelven
instancias de CreateCollectionOptions para permitir seteos “en
cadena”:
– public CreateCollectionOptions collation(Collation c): Establece opciones
de “collation” sobre la colección.
– public CreateCollectionOptions expireAfter(long e, TimeUnit tu): Establece,
en la unidad de tiempo especificada, el tiempo que perdurará un
documento antes de ser eliminado automáticamente.
• Una vez seteado el tiempo, éste es convertido automáticamente a segundos
desde la unidad de tiempo especificada
• Este método no admite “fracciones de segundo”.
La clase CreateCollectionOptions
• En vez de tener métodos setter convencionales para
establecer las opciones, la clase cuenta con métodos que
devuelven instancias de CreateCollectionOptions para
permitir seteos “en cadena”:
– public CreateCollectionOptions
timeSeriesOptions(TimeSeriesOptions tso): Establece opciones
de series temporales.
• Es requerido llamar a este método si se desea dar tiempo límite a los
documentos con expireAfter.
La clase CreateCollectionOptions
• Existen otras opciones que no se verán en este documento por ser
muy complejas.
• Para las opciones seteadas con los métodos listados en diapositivas
anteriores, también existe un método getter para obtenerlas:
– public long getMaxDocuments()
– public boolean isCapped()
– public long getSizeInBytes
– public ValidationOptions getValidationOptions()
– public Collation getCollation()
– public long getExpireAfter()
– public TimeSeriesOptions getTimeSeriesOptions()
La clase ValidationOptions
• Esta clase, ubicada en el paquete
[Link] permite establecer reglas de
validación.
• Tiene un único constructor, que es el constructor por
defecto.
• La clase además sobrescribe el método toString de la
clase Object.
La clase ValidationOptions
• Cada objeto ValidationOptions cuenta con un nivel de validación,
una acción y un documento con la validación propiamente tal, las
cuales pueden obtenerse con los siguentes métodos getter:
– public Bson getValidator()
– public ValidationLevel getValidationLevel()
– public ValidationAction getValidationAction()
• Además, dichos miembros se pueden setear en cadena con los
siguientes métodos:
– public ValidationOptions validator(Bson v)
– public ValidationOptions validationLevel(ValidationLevel vl)
– public ValidationOptions validationAction(ValidationAction va)
La enumeración ValidationLevel
• Esta enumeración, ubicada en el paquete [Link] define
constantes para los posibles niveles de validación soportados por MongoDB:
– OFF (sin validación)
– STRICT (validación en documentos nuevos y modificados)
– MODERATE (validación solo en documentos nuevos)
• Cada constante está asociada a un string igual al nombre de la constante
con todas las letras minúsculas. El string puede obtenerse con el método
ValidationLevel.<constante>.getValue()
• Además, es posible crear un objeto ValidationLevel a partir de un string con
el método estático fromString(String vl)
– El valor de vl no debe ser nulo y debe ser cualquiera mencionado en el punto
anterior o se lanzará una excepción
La enumeración ValidationAction
• Esta enumeración, ubicada en el paquete
[Link] define constantes para las acciones a
realizar en caso de una validación fallida con un nivel igual a
[Link] o [Link]:
– ERROR (Indicar error y abortar la operación)
– WARN (Indicar error en el log sin abortar la operación)
• Al igual que con ValidationLevel, cada constante está asociada a
un string igual que el nombre de la constante con todas sus letras
minúsculas y también están definidos los métodos public String
getValue() y public static ValidationAction fromString(String va)
La clase Collation
• Esta clase, ubicada en el paquete [Link],
permite establecer opciones de collation.
• La clase no tiene constructores públicos, pero tiene una clase
interna llamada Builder desde la cual crear un objeto Collation con
el método build()
• Para obtener un objeto Builder, Collation proporciona los
siguientes métodos:
– public static [Link] builder(): Crea un nuevo objeto Builder sin
configuración establecida
– public static [Link](Collation c): Crea un nuevo objeto Builder
con la configuración establecida en c.
La clase Collation
• Además del método build, la clase Builder de Collation tiene los
siguientes métodos:
– public [Link] locale(String l): Establece el “locale” (idioma) de la
collation de acuerdo con la ICU (Fuente: [Link]
[Link]/locale)
 El objeto l puede ser nulo.
– public [Link] caseLevel(Boolean cl): Si el valor de cl es true,
activa distinción entre mayúsculas y minúsculas. El objeto cl puede ser
nulo.
– public [Link] collationStrength(CollationStrength cs): Establece
cómo se manejan las diferencias entre caracteres. El objeto cs puede ser
nulo.
La clase Collation
• Además del método build, la clase Builder de Collation
tiene los siguientes métodos:
– public [Link] collationCaseFirst(CollationCaseFirst ccf):
Determina si las minúsculas o las mayúsculas toman precedencia
al comparar caracteres que, en ausencia de distinción entre
mayúsculas y minúsculas, se consideran iguales. El objeto ccf
puede ser nulo.
– public [Link] numericOrdering(Boolean ord): Si el valor
de ord es [Link], compara los strings numéricos como si
fueran números en vez de strings. El objeto odr puede ser nulo.
La clase Collation
• Además del método build, la clase Builder de Collation
tiene los siguientes métodos:
– public [Link] collationAlternate(CollationAlternate ca):
Determina si los espacios en blanco y/o las puntuaciones son
considerados caracteres base. El objeto ca puede ser nulo.
– public [Link]
collationMaxVariable(CollationMaxVariable cmv): Determina qué
caracteres son afectados entre puntuaciones y espacios en
blanco cuando en la última llamada al método anterior se le pasa
como parámetro la constante [Link]. El
objeto cmv puede ser nulo.
La clase Collation
• Además del método build, la clase Builder de Collation
tiene los siguientes métodos:
– public [Link] normalization(Boolean n): Si el valor de
n es [Link], se indica que el texto debe ser
normalizado en Unicode NFD. El objeto n puede ser nulo.
– public [Link] backwards(Boolean b): Si el valor de b
es [Link], las diferencias secundarias se consideran
en orden inverso como en el lenguaje francés y similares. El
objeto b puede ser nulo.
La clase Collation
• Una vez creado el objeto Collation con el método build() de su Builder,
cada campo seteado se puede obtener con los siguientes métodos
getter. Los valores devueltos para cada método pueden ser nulos:
– public String getLocale()
– public Boolean getCaseLevel()
– public CollationCaseFirst getCaseFirst()
– public CollationStrength getStrength()
– public Boolean getNumericOrdering()
– public CollationAlternate getAlternate()
– public CollationMaxVariable getMaxVariable()
– public Boolean getNormalization()
– public Boolean getBackwards()
La clase Collation
• Además, es posible crear un objeto BsonDocument con
la información de cada objeto Collation llamando al
método public BsonDocument asDocument().
– El objeto devuelto puede no contener campos.
– Útil para pasar un objeto collation como parámetro para la
llamada al método de una colección o de un comando.
• Además, Collation sobrescribe los métodos equals,
hashCode y toString de la clase Object
La enumeración CollationCaseFirst
• Esta enumeración, ubicada en el paquete [Link] define
constantes para determinar la precedencia al comparar mayúsculas y
minúsculas:
– OFF (No aplicar precedencia)
– UPPER (Las mayúsculas van primero)
– LOWER (Las minúsculas van primero)
• Cada constante está asociada a un string igual al nombre de la constante con
todas las letras minúsculas. El string puede obtenerse con el método
CollationCaseFirst.<constante>.getValue()
• Además, es posible crear un objeto CollationCaseFirst a partir de un string con
el método estático fromString(String vl)
– El valor de vl no debe ser nulo y debe ser cualquiera mencionado en el punto
anterior o se lanzará una excepción
La enumeración CollationStrength
• Esta enumeración, ubicada en el paquete [Link] define cómo un objeto
Collation maneja las diferencias entre caracteres:
– PRIMARY (El nivel más fuerte. Diferencias entre caracteres base)
– SECONDARY (Comparar también presencia de acentos)
– TERTIARY (Comparar también mayúsculas y minúsculas)
– QUATERNARY (Comparar también presencia de puntuaciones)
– IDENTICAL (si no es posible comparar un caracter con todos los niveles anteriores, se
comparan los valores de “code point” Unicode de la forma NFD de cada String)
• Cada constante está asociada a un entero: 1 para PRIMARY, 2 para SECONDARY, 3 para
TERTIARY, 4 para CUATERNARY y 5 para IDENTICAL). El número puede obtenerse con el
método CollationStrength.<constante>.getValue()
• Además, es posible crear un objeto CollationStrength a partir de un número con el método
estático fromInt(int vl)
– El valor de vl debe estar entre 1 y 5 o se lanzará una excepción
La enumeración CollationAlternate
• Esta enumeración, ubicada en el paquete [Link] define constantes para
determinar si las puntuaciones y espacios en blanco se consideran caracteres base:
– NON_IGNORABLE (Espacios y puntuaciones se consideran caracteres base)
– SHIFTED (Espacios y puntuaciones no se consideran caracteres base y solo pueden
distinguirse cuando la última llamada al método collationStrength del Builder de Collation
anterior a build traspase como parámetro la constante [Link],
[Link] o [Link])
• Cada constante está asociada a un string igual al nombre de la constante con todas las
letras minúsculas y el guion medio (-) en vez del guion bajo (_). El string puede obtenerse
con el método CollationAlternate.<constante>.getValue()
• Además, es posible crear un objeto CollationAlternate a partir de un string con el método
estático fromString(String vl)
– El valor de vl no debe ser nulo y debe ser cualquiera mencionado en el punto anterior o
se lanzará una excepción
La enumeración CollationMaxVariable
• Esta enumeración, ubicada en el paquete [Link] define constantes
para determinar en qué manera las puntuaciones y espacios en blanco son afectadas
cuando en la última llamada al método collationAlternate del Builder de Collation
anterior a build se pase como parámetro la constante [Link] :
– PUNCT (Las puntuaciones y espacios en blanco se consideran caracteres base)
– SPACE (Solo los espacios en blanco se consideran caracteres base)
• Cada constante está asociada a un string igual al nombre de la constante con todas las
letras minúsculas. El string puede obtenerse con el método
CollationMaxVariable.<constante>.getValue()
• Además, es posible crear un objeto CollationMaxVariable a partir de un string con el
método estático fromString(String vl)
– El valor de vl no debe ser nulo y debe ser cualquiera mencionado en el punto
anterior o se lanzará una excepción
La clase TimeSeriesOptions
• Esta clase, ubicada en el paquete [Link], permite establecer opciones
de series de tiempo cuando se desea dar un tiempo límite a cada documento antes de ser
eliminado automáticamente.
• La clase tiene un único constructor que admite un String con un campo de tiempo (véase
más abajo).
• Cada instancia de esta clase contiene lo siguiente:
– El nombre de un campo de alto nivel usado para el tiempo
• Los documentos insertados a una colección deben tener ese campo y debe ser de tipo BsonDateTime
– El nombre de un campo que contenga metadatos en cada documento temporal para etiquetar una serie
única de documentos
• El campo es usado para agrupar datos relacionados
• El campo puede ser de cualquier tipo definido por BSON excepto BsonArray
• El nombre del campo de metadatos no puede ser el mismo que el campo de tiempo y no puede ser _id.
• El nombre del campo puede ser nulo
– La granularidad de los datos temporales
• La granularidad puede ser nula
• Si se omite, se asume el valor de la constante [Link]
La clase TimeSeriesOptions
• A excepción del campo de tiempo, que solo puede ser seteado una sola vez por
cada objeto usando el constructor, la información listada en la diapositiva
anterior puede ser seteada “en cadena” con los siguientes métodos:
– public TimeSeriesOptions metaField(String mf)
– public TimeSeriesOptions granularity(TimeSeriesGranularity)
• Además, la información completa puede obtenerse con estos métodos getter:
– public String getTimeField()
– public String getMetaField()
– public TimeSeriesGranularity getGranularity()
• Además, la clase sobrescribe el método toString de la clase Object.
• TimeSeriesGranularity es una enumeración en el mismo paquete que
TimeSeriesOptions y define las siguientes constantes: SECONDS (segundos),
MINUTES (minutos) y HOURS (horas)
La clase CreateViewOptions
• Esta clase, ubicada en el paquete [Link]
permite establecer opciones para crear vistas.
• Cada objeto de esta clase contiene únicamente un objeto
Collation interno (que puede ser nulo para indicar que se usará
la configuración por defecto de collation proporcionada por el
servidor) y puede obtenerse con el método public Collation
getCollation() y setearse con public CreateViewOptions
collation(Collation c)
• Además, la clase sobrescribe el método toString de la clase
Object
La interfaz MongoCollection<T>
• Una vez obtenido el objeto MongoDatabase para trabajar con la base de datos, este
debe ser utilizado para operaciones CRUD con colecciones.
• Para representar colecciones, el paquete [Link] proporciona la
interfaz MongoCollection<T>
• MongoDB proporciona clases que implementan esta interfaz. Dichas clases son
insignificantes para el programador.
• Para obtener un objeto MongoCollection desde una base de datos, desde el objeto
MongoDatabase se debe llamar a cualquiera de las sobrecargas del método
getCollection de la interfaz MongoDatabase
• Para poder obtener un objeto MongoCollection apuntando a una colección en la
base de datos, la colección debe haber sido creada en esa base de datos, ya sea
directamente o llamando a cualquiera de las sobrecargas del método
createCollection de la interfaz MongoDatabase.
La interfaz MongoCollection<T>: Métodos
• public MongoNamespace getNamespace(): Obtiene el espacio
de nombres (nombre de base de datos y nombre de colección)
de la colección
• public Class<T> getDocumentClass(): Obtiene la instancia de
Class haciendo referencia a la clase T especificada.
• public MongoCollection<U> withDocumentClass(Class<U> nc):
Crea un nuevo objeto MongoCollection a partir de la
información del objeto actual especificando una clase diferente
para representar cada documento obtenido de la colección.
La interfaz MongoCollection<T>: Métodos
• public long countDocuments(): Cuenta la cantidad de documentos
en la colección.
– Este método y todas sus sobrecargas llaman al método countDocuments
de la colección en la base de datos.
• public long countDocuments(Bson filter): Cuenta la cantidad de
documentos en la colección que satisfagan el filtro especificado
– Para crear un objeto que sea usado como filtro para este y todos los
métodos que requieran de un filtro de documentos, véase la clase Filters
• public long countDocuments(Bson filter, CountOptions opts): Igual
que el anterior pero de acuerdo a las opciones especificadas
La interfaz MongoCollection<T>: Métodos
• public long countDocuments(ClientSession cs): igual que
countDocuments() pero asociando la operación a la sesión
de cliente especificada.
• public long countDocuments(ClientSession cs, Bson filter):
Igual a countDocuments(filter) pero asociando la operación a
la sesión de cliente especificada.
• public long countDocuments(ClientSession cs, Bson filter,
CountOptions opts): Igual a countDocuments(filter, opts) pero
asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public long estimatedDocumentCount(): Obtiene un
estimado de la cantidad de documentos en la colección
usando los metadatos de ésta.
– Este método y todas sus sobrecargas llaman al método count
de la colección en la base de datos.
• public long
estimatedDocumentCount(EstimatedDocumentCountOpti
ons Opts): Igual que el anterior pero de acuerdo a las
opciones especificadas
La interfaz MongoCollection<T>: Métodos
• public DistinctIterable<U> distinct(String field, Class<U> resClass):
Obtiene un iterable con todos los valores distintos del campo field,
convertidos en instancias de una clase U
• public DistinctIterable<U> distinct(ClientSession cs, String field,
Class<U> resClass): Igual al anterior, pero asociando la operación a la
sesión de cliente especificada.
• public DistinctIterable<U> distinct(String field, Bson filter, Class<U>
resClass): Igual a distinct(field, resClass), pero aplicando un filtro.
• public DistinctIterable<U> distinct(ClientSession cs, String field, Bson
filter, Class<U> resClass): Igual que el anterior, pero asociando la
operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public FindIterable<T> find(): Obtiene un iterable apuntando a
todos los documentos de la colección
• public FindIterable<U> find(Class<U> resClass): Igual al anterior,
pero convirtiendo todos los resultados a instancias de una clase U.
• public FindIterable<T> find(Bson filter): Obtiene un iterable
apuntando a todos los documentos de la colección que satisfagan
el filtro especificado.
• public FindIterable<U> find(Bson filter, Class<U> resClass): Igual
al anterior, pero convirtiendo todos los resultados a instancias de
una clase U.
La interfaz MongoCollection<T>: Métodos
• public FindIterable<T> find(ClientSession cs): Igual que find() pero
asociando la operación a la sesión de cliente especificada.
• public FindIterable<U> find(ClientSession cs, Class<U> resClass):
Igual a find(resClass), pero asociando la operación a la sesión de
cliente especificada.
• public FindIterable<T> find(ClientSession cs, Bson filter): igual a
find(filter) pero asociando la operación a la sesión de cliente
especificada.
• public FindIterable<U> find(ClientSession cs, Bson filter, Class<U>
resClass): Igual a find(filter, resClass) pero asociando la operación a la
sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public AggregateIterable<T> aggregate(List<? extends Bson> pipeline):
Ejecuta el método aggregate en la base de datos para la colección pasando
a través de pipeline una lista de etapas
• public AggregateIterable<T> aggregate(ClientSession cs, List<? extends
Bson> pipeline): Igual al anterior, pero asociando la operación a la sesión de
cliente especificada
• public AggregateIterable<U> aggregate(List<? extends Bson> pipeline,
Class<U> resClass): Igual a aggregate(pipeline), pero convirtiendo cada
documento en el resultado a una instancia de una clase U.
• public AggregateIterable<U> aggregate(ClientSession cs, List<? extends
Bson> pipeline, Class<U> resClass): Igual al anterior, pero asociando la
operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public BulkWriteResult bulkWrite(List<? extends WriteModel<? extends T>>
reqs): Ejecuta una escritura masiva con inserts, updates, replaces y/o
deletes especificados en reqs. Puede lanzar una excepción en caso de error.
• public BulkWriteResult bulkWrite(ClientSession cs, List<? extends
WriteModel<? extends T>> reqs): Igual al anterior, pero asociando la
operación a la sesión de cliente especificada.
• public BulkWriteResult bulkWrite(List<? extends WriteModel<? extends T>>
reqs, BulkWriteOptions opts): Igual que bulkWrite(reqs), pero especificando
opciones de escritura masiva.
• public BulkWriteResult bulkWrite(ClientSession cs, List<? extends
WriteModel<? extends T>> reqs, BulkWriteOptions opts): Igual que el
anterior, pero asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public InsertOneResult insertOne(T doc): Inserta un documento
en la colección. Puede lanzar una excepción en caso de error.
• public InsertOneResult insertOne(ClientSession cs, T doc): Igual
al anterior, pero asociando la operación a la sesión de cliente
especificada.
• public InsertOneResult insertOne(T doc, InsertOneOptions opts):
Igual a insertOne(doc), pero especificando opciones de escritura.
• public InsertOneResult insertOne(ClientSession cs, T doc,
InsertOneOptions opts): Igual al anterior, pero asociando la
operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public InsertManyResult insertMany(List<? extends T> ldocs): Inserta todos
los documentos de ldocs en la colección. Puede lanzar una excepción en
caso de error.
• public InsertManyResult insertMany(ClientSession cs, List<? extends T>
ldocs): Igual al anterior, pero asociando la operación a la sesión de cliente
especificada.
• public InsertManyResult insertMany(List<? extends T> ldocs,
InsertManyOptions opts): Igual a insertMany(ldocs), pero especificando
opciones de escritura.
• public InsertManyResult insertMany(ClientSession cs, List<? extends T>
ldocs, InsertManyOptions opts): Igual al anterior, pero asociando la
operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public DeleteResult deleteOne(Bson filter): Elimina el primer
documento de la colección que cumpla con el filtro especificado.
Puede lanzar una excepción en caso de error.
• public DeleteResult deleteOne(ClientSession cs, Bson filter): Igual al
anterior, pero asociando la operación a la sesión de cliente
especificada.
• public DeleteResult deleteOne(Bson filter, DeleteOptions opts): Igual a
deleteOne(filter), pero especificando opciones de eliminación.
• public DeleteResult deleteOne(ClientSession cs, Bson filter,
DeleteOptions opts): Igual al anterior, pero asociando la operación a la
sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public DeleteResult deleteMany(Bson filter): Elimina todos los
documentos de la colección que cumplan con el filtro especificado.
Puede lanzar una excepción en caso de error.
• public DeleteResult deleteMany(ClientSession cs, Bson filter): Igual al
anterior, pero asociando la operación a la sesión de cliente
especificada.
• public DeleteResult deleteMany(Bson filter, DeleteOptions opts): Igual
al deleteMany(filter), pero especificando opciones de eliminación.
• public DeleteResult deleteMany(Bson filter, DeleteOptions opts): Igual
al anterior, pero asociando la operación a la sesión de cliente
especificada.
La interfaz MongoCollection<T>: Métodos
• public UpdateResult replaceOne(Bson filter, T doc): Reemplaza el primer
documento que cumpla con el filtro especificado por el documento doc.
Puede lanzar una excepción en caso de error.
• public UpdateResult replaceOne(ClientSession, Bson filter, T doc): Igual
al anterior, pero asociando la operación a la sesión de cliente
especificada.
• public UpdateResult replaceOne(Bson filter, T doc, ReplaceOptions opts):
Igual a replaceOne(filter, doc), pero especificando opciones de reemplazo.
• public UpdateResult replaceOne(Bson filter, T doc, ReplaceOptions opts):
Igual al anterior, pero asociando la operación a la sesión de cliente
especificada.
La interfaz MongoCollection<T>: Métodos
• public UpdateResult updateOne(Bson filter, Bson upd): Actualiza el primer documento
en la colección que cumpla con el filtro especificado de acuerdo a las indicaciones en
upd. Puede lanzar una excepción en caso de error
– Para crear objetos Bson que indiquen qué y cómo actualizar del(los) documento(s)
encontrado(s) en este y en cualquier método dedicado a actualizar documentos, vea la clase
Updates.
• public UpdateResult updateOne(Bson filter, Bson upd, UpdateOptions opts): Igual al
anterior, pero especificando opciones de actualización
• public UpdateResult updateOne(Bson filter, List<? extends Bson> pipeline): Actualiza el
primer documento encontrado en la colección que cumpla con el filtro especificado de
acuerdo a las etapas especificadas en pipeline. Puede lanzar una excepción en caso de
error.
• public UpdateResult updateOne(Bson filter, List<? extends Bson> pipeline,
UpdateOptions opts): Igual al anterior, pero especificando opciones de actualización
La interfaz MongoCollection<T>: Métodos
• public UpdateResult updateOne(ClientSession cs, Bson filter, Bson upd):
Igual a updateOne(filter, upd), pero asociando la operación a la sesión de
cliente especificada.
• public UpdateResult updateOne(ClientSession cs, Bson filter, Bson upd,
UpdateOptions opts): Igual a updateOne(filter, upd, opts), pero asociando la
operación a la sesión de cliente especificada.
• public UpdateResult updateOne(ClientSession cs, Bson filter, List<? extends
Bson> pipeline): Igual a updateOne(filter, pipeline), pero asociando la
operación a la sesión de cliente especificada.
• public UpdateResult updateOne(ClientSession cs, Bson filter, List<? extends
Bson> pipeline, UpdateOptions opts): Igual a updateOne(filter, pipeline, opts),
pero asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public UpdateResult updateMany(Bson filter, Bson upd): Actualiza todos los
documentos en la colección que cumplan con el filtro especificado de
acuerdo a las indicaciones en upd. Puede lanzar una excepción en caso de
error
• public UpdateResult updateMany(Bson filter, Bson upd, UpdateOptions
opts): Igual al anterior, pero especificando opciones de actualización
• public UpdateResult updateMany(Bson filter, List<? extends Bson> pipeline):
Actualiza todos los documentos en la colección que cumplan con el filtro de
acuerdo a las etapas en pipeline. Puede lanzar una excepción en caso de
error.
• public UpdateResult updateMany(Bson filter, List<? extends Bson> pipeline,
UpdateOptions opts): Igual al anterior, pero especificando opciones de
actualización.
La interfaz MongoCollection<T>: Métodos
• public UpdateResult updateMany(ClientSession cs, Bson filter, Bson upd):
Igual que updateMany(filter, upd), pero asociando la operación a la sesión de
cliente especificada.
• public UpdateResult updateMany(ClientSession cs, Bson filter, Bson upd,
UpdateOptions opts): Igual que updateMany(filter, upd, opts), pero asociando
la operación a la sesión de cliente especificada.
• public UpdateResult updateMany(ClientSession cs, Bson filter, List<?
extends Bson> pipeline): Igual que updateMany(filter, pipeline), pero
asociando la operación a la sesión de cliente especificada.
• public UpdateResult updateMany(ClientSession cs, Bson filter, List<?
extends Bson> pipeline, UpdateOptions opts): Igual que updateMany(filter,
pipeline, opts), pero asociando la operación a la sesión de cliente
especificada.
La interfaz MongoCollection<T>: Métodos
• public T findOneAndDelete(Bson filter): Intenta eliminar el primer
elemento encontrado en la colección que cumpla con el filtro especificado.
Si lo logra, devuelve el documento eliminado. En caso contrario, devuelve
null.
• public T findOneAndDelete(Bson filter, FindOneAndDeleteOptions opts):
Igual al anterior, pero especificando opciones de búsqueda y eliminación.
• public T findOneAndDelete(ClientSession cs, Bson filter): Igual a
findOneAndDelete(filter), pero asociando la operación a la sesión de
cliente especificada.
• public T findOneAndDelete(ClientSession cs, Bson filter,
FindOneAndDeleteOptions opts): Igual findOneAndDelete(filter, opts),
pero asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public T findOneAndReplace(Bson filter, T doc): Intenta reemplazar el primer elemento
encontrado en la colección que cumpla con el filtro especificado por doc. Si lo logra,
devuelve el documento sustituido. En caso contrario, devuelve null.
• public T findOneAndReplace(Bson filter, T doc, FindOneAndReplaceOptions opts): Igual
al anterior, pero especificando opciones de búsqueda y reemplazo.
– NOTA: Dependiendo de los valores guardados en opts, se puede devolver el nuevo
documento en vez del antiguo.

• public T findOneAndReplace(ClientSession cs, Bson filter, T doc): Igual a


findOneAndReplace(filter, doc), pero asociando la operación a la sesión de cliente
especificada.
• public T findOneAndReplace(ClientSession cs, Bson filter, T doc,
FindOneAndReplaceOptions opts): Igual a findOneAndReplace(filter, doc, opts), pero
asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public T findOneAndUpdate(Bson filter, Bson upd): Intenta actualizar el primer elemento
encontrado en la colección que cumpla con el filtro especificado con las indicaciones en
upd. Si lo logra, devuelve el documento actualizado. En caso contrario, devuelve null.
• public T findOneAndUpdate(Bson filter, Bson upd, FindOneAndUpdateOptions opts):
Igual al anterior, pero especificando opciones de búsqueda y actualización.
– NOTA: Dependiendo de los valores guardados en opts, se puede devolver el documento resultante
de la actualización en vez del documento original.
• public T findOneAndUpdate(ClientSession cs, Bson filter, Bson upd): Igual a
findOneAndUpdate(filter, upd), pero asociando la operación a la sesión de cliente
especificada.
• public T findOneAndUpdate(ClientSession cs, Bson filter, Bson upd,
FindOneAndUpdateOptions opts): Igual a findOneAndUpdate(filter, upd, opts), pero
asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public T findOneAndUpdate(Bson filter, List<? extends Bson> pipeline): Intenta actualizar el
primer elemento encontrado en la colección que cumpla con el filtro especificado de acuerdo
a las etapas en pipeline. Si lo logra, devuelve el documento actualizado. En caso contrario,
devuelve null.
• public T findOneAndUpdate(Bson filter, List<? extends Bson> pipeline,
FindOneAndUpdateOptions opts): Igual al anterior, pero especificando opciones de
búsqueda y actualización.
– NOTA: Dependiendo de los valores guardados en opts, se puede devolver el documento resultante de la
actualización en vez del documento original.
• public T findOneAndUpdate(ClientSession cs, Bson filter, List<? extends Bson> pipeline):
Igual a findOneAndUpdate(filter, pipeline), pero asociando la operación a la sesión de cliente
especificada.
• public T findOneAndUpdate(ClientSession cs, Bson filter, List<? extends Bson> pipeline,
FindOneAndUpdateOptions opts): Igual a findOneAndUpdate(filter, pipeline, opts), pero
asociando la operación a la sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public void drop(): Elimina la colección de la base de datos.
• public void drop(ClientSession cs): Igual al anterior, pero
asociando la operación a la sesión de cliente especificada.
• public void drop(DropCollectionOptions opts): Igual a drop(),
pero especificando opciones de eliminación.
• public void drop(ClientSession cs, DropCollectionOptions
opts): Igual al anterior, pero asociando la operación a la
sesión de cliente especificada.
La interfaz MongoCollection<T>: Métodos
• public void renameCollection(MongoNamespace ns): Cambia el nombre a la
colección por el especificado en ns. Puede lanzar una excepción en caso de
error
– NOTA: Si la base de datos en ns es distinta a la actual, la colección puede moverse
desde la base de datos actual a la especificada.
• public void renameCollection(MongoNamespace ns, RenameCollectionOptions
opts): Igual al anterior, pero especificando opciones de renombramiento.
• public void renameCollection(ClientSession cs, MongoNamespace ns): Igual a
renameCollection(ns), pero asociando la operación a la base de datos
especificada.
• public void renameCollection(ClientSession cs, MongoNamespace ns,
RenameCollectionOptions opts): Igual a renameCollection(ns, opts), pero
asociando la operación a la base de datos especificada.
La clase MongoNamespace
• Esta clase, ubicada en el paquete [Link], sirve para trabajar con
“espacios de nombres”.
• Un espacio de nombres en MongoDB se define como el nombre de la
colección y el nombre de la base de datos a la que pertenece en formato
<bd>.<coll>
• La clase proporciona 2 constructores:
– public MongoNamespace(String fullName): Crea un objeto a partir del nombre
de un namespace.
• El parámetro fullName debe ser un namespace válido en el formato especificado arriba, o se
lanzará una excepción
– public MongoNamespace(String db, String coll): Crea un objeto a partir del
nombre de una base de datos y el de una colección.
• Ambos nombres deben ser válidos o se lanzará una excepción
La clase MongoNamespace
• Ambos constructores llaman a dos métodos públicos estáticos para
validar el nombre de la base de datos y el nombre de la colección.
– public static void checkDatabaseNameValidity(String dbn): Chequea si el
nombre de una base de datos cumple con el formato impuesto por MongoDB. Si
la validación falla, se lanzará una excepción.
• El nombre de una base de datos se considera válido si cumple con todas las siguientes
condiciones:
– No debe ser nulo
– No debe ser vacío
– No debe contener los siguientes caracteres: El caracter nulo (\0), el slash (/), el backslash (\), un
espacio en blanco, comillas dobles y el punto
– public static void checkCollectionNameValidity(String coln): Chequea si el
nombre de una colección no es nulo y no lleva espacios en blanco. Si la
validación falla, se lanzará una excepción.
La clase MongoNamespace
• El nombre de la base de datos y el de la colección se
pueden obtener juntos y/o por separado con los
siguientes métodos getter:
– public String getDatabaseName()
– public String getCollectionName()
– public String getFullName()
• Además, la clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase CountOptions
• Esta clase, ubicada en el paquete [Link],
permite especificar opciones al momento de llamar a
countDocuments desde un objeto MongoCollection.
• La clase tiene un único constructor, el constructor por defecto.
• De toda la información contenida en un objeto CountOptions, lo
fundamental es el límite máximo de documentos a contar (que
puede ser cero para indicar que no hay límite), el número de
documentos a ignorar (que puede ser cero para indicar que no se
debe ignorar ningún documento), el máximo de tiempo en
milisegundos (que puede ser cero para indicar que no hay límite de
tiempo) y la collation.
La clase CountOptions
• La información listada en la diapositiva anterior se puede obtener desde un
objeto CountOptions con los siguientes métodos getter:
– public int getLimit()
– public int getSkip()
– public long getMaxTimeMS(TimeUnit tu)
– public Collation getCollation()
• Además, esa misma información se puede setear en cadena con los
siguientes métodos:
– public CountOptions limit(int limit)
– public CountOptions skip(int skip)
– public CountOptions maxTimeMS(long maxT, TimeUnit tu)
– public CountOptions collation(Collation c)
• Además, la clase sobrescribe el método toString de la clase Object
La clase EstimateDocumentCountOptions
• Esta clase, ubicada en el paquete [Link]
permite establecer opciones al llamar al método
estimatedDocumentCount desde un objeto MongoDocument
• Al igual que CountOptions, esta clase tiene su constructor por
defecto y sobrescribe el método toString de Object.
• Pero a diferencia de CountOptions, esta clase solo cuenta con el
tiempo máximo de ejecución el milisegundos, que puede obtenerse
o setearse con:
– public long getMaxTimeMS(TimeUnit tu)
– public EstimatedDocumentCountOptions maxTimeMS(long maxT,
TimeUnit tu)
La interfaz DistinctIterable<T>
• Esta interfaz, que pertenece al paquete [Link], debe ser
implementada por clases que deseen iterar sobre el resultado de la
llamada al método distinct de un objeto MongoCollection.
• MongoDB proporciona clases que implementan la interfaz y son
insignificantes para el programador.
• Esta interfaz es una extensión de MongoIterable<T> por lo que hereda
todos los métodos de esa interfaz y cualquier objeto que sea instancia
de esa interfaz puede ser iterado con un for a modo de foreach.
• Los métodos que son propios de esta interfaz permiten hacer
operaciones “en cadena” con el objeto DistinctIterable.
La interfaz DistinctIterable<T>: métodos propios
• public DistinctIterable<T> filter(Bson filter): Aplica un filtro a “este”
iterable y devuelve el iterable resultante
• public DistinctIterable<T> maxTime(long maxT, TimeUnit tu): Aplica
un tiempo máximo de ejecución en la unidad de tiempo especificada
(que no puede ser nula) y devuelve el iterable resultante.
• public DistinctIterable<T> batchSize(int bs): Aplica la cantidad
máxima de documentos a devolver por batch y devuelve el iterable
resultante.
• public DistinctIterable<T> collation(Collation c): Aplica opciones de
collation y devuelve el iterable resultante. El objeto c puede ser nulo
para indicar que se aplicará la collation por defecto.
La interfaz FindIterable<T>
• Esta interfaz, que pertenece al paquete [Link], debe ser
implementada por clases que deseen iterar sobre el resultado de la
llamada al método find de un objeto MongoCollection.
• MongoDB proporciona clases que implementan la interfaz y son
insignificantes para el programador.
• Esta interfaz es una extensión de MongoIterable<T> por lo que hereda
todos los métodos de esa interfaz y cualquier objeto que sea instancia
de esa interfaz puede ser iterado con un for a modo de foreach.
• Los métodos que son propios de esta interfaz permiten hacer
operaciones “en cadena” con el objeto FindIterable.
La interfaz FindIterable<T>: métodos propios
• public FindIterable<T> filter(Bson filter): Aplica un filtro a “este”
iterable y devuelve el iterable resultante
• public FindIterable<T> maxTime(long maxT, TimeUnit tu): Aplica un
tiempo máximo de ejecución en la unidad de tiempo especificada
(que no puede ser nula) y devuelve el iterable resultante.
• public FindIterable<T> batchSize(int bs): Aplica la cantidad máxima
de documentos a devolver por batch y devuelve el iterable
resultante.
• public FindIterable<T> collation(Collation c): Aplica opciones de
collation y devuelve el iterable resultante. El objeto c puede ser nulo
para indicar que se aplicará la collation por defecto.
La interfaz FindIterable<T>: métodos propios
• public FindIterable<T> cursorType(CursorType ct): Aplica el tipo interno del cursor
devuelto por la llamada a find en la base de datos y devuelve el iterable resultante.
• public FindIterable<T> maxAwaitTime(int maxT, TimeUnit tu): Aplica el tiempo
máximo de espera por nuevos documentos en la unidad de tiempo especificada y
devuelve el iterable resultante.
– Una llamada a este método se ignora para objetos FindIterable que no son
devueltos directamente o después de llamadas a otros métodos, por una
llamada a cursorType pasándole como parámetro la constante
[Link]
• public FindIterable<T> projection(Bson p): Establece, por medio de p, los campos
que se desean obtener de cada resultado de la búsqueda y devuelve el iterable
resultante.
La interfaz FindIterable<T>: métodos propios

• public FindIterable<T> sort(Bson s): Establece, por medio


de s, los campos utilizados para ordenar los resultados y,
para cada uno, la dirección del ordenamiento. Luego
devuelve el iterable resultante.
• public FindIterable<T> noCursorTimeout(boolean nct): Si
el valor de nct es true, el cursor devuelto por la llamada a
find no se cerrará automáticamente por inactividad. Una
vez asignado este valor, se devuelve el iterable resultante.
La interfaz FindIterable<T>: métodos propios

• public FindIterable<T> partial(boolean p): Si el valor de p es


true, se obtienen resultados parciales si la conexión con la
base de datos se pierde, en vez de lanzar un error. Una
vez asignado este valor, se devuelve el iterable resultante.
• public FindIterable<T> let(Bson vars): Declara variables
para que sean reconocidas por MongoDB en cualquier
expresión Bson utilizada en la llamada a find. Luego
devuelve el iterable resultante.
– El objeto vars puede ser nulo
La interfaz FindIterable<T>: métodos propios
• public FindIterable<T> showRecordId(boolean sri): Si el valor
de sri es true, a cada documento obtenido de la búsqueda se
agregará un campo llamado $recordId con valor igual al
número del registro. Una vez asignado este valor, se devuelve
el iterable resultante.
• public FindIterable<T> allowDiskUse(Boolean adu): Si adu no
es nulo y su valor es [Link], se permite la escritura en
archivos temporales en el servidor durante la ejecución del
método find. Una vez asignado este valor, se devuelve el
iterable resultante.
La enumeración CursorType
• Esta enumeración, ubicada en el paquete [Link], define
constantes para determinar tipos de cursor:
– NonTailable: El cursor se cierra automáticamente cuando el último
documento es obtenido de éste
– Tailable: El cursor no se cierra automáticamente, sino que espera que
lleguen nuevos documentos para ser leídos después.
– TailableAwait: Igual que el anterior que permanace en hibernación antes de
devolver un batch vacío. En comparación con la constante anterior, esta
implica uso reducido de recursos.
• Cada constante contiene un método público booleano llamado
isTailable() que devuelve false para la constante NonTailable y true
para las demás.
La interfaz AggregateIterable<T>
• Esta interfaz, que pertenece al paquete [Link], debe ser
implementada por clases que deseen iterar sobre el resultado de la
llamada al método aggregate de un objeto MongoCollection.
• MongoDB proporciona clases que implementan la interfaz y son
insignificantes para el programador.
• Esta interfaz es una extensión de MongoIterable<T> por lo que hereda
todos los métodos de esa interfaz y cualquier objeto que sea instancia
de esa interfaz puede ser iterado con un for a modo de foreach.
• Los métodos que son propios de esta interfaz permiten hacer
operaciones “en cadena” con el objeto AggregateIterable.
La interfaz AggregateIterable<T>: métodos propios
• public void toCollection(): Agrega documentos a la colección de acuerdo
con el pipeline especificado en la llamada a aggregate.
– La última etapa en el pipeline debe ser $out o $merge, o se lanzará una
excepción.
• public AggregateIterable<T> maxTime(long maxT, TimeUnit tu): Aplica un
tiempo máximo de ejecución en la unidad de tiempo especificada (que no
puede ser nula) y devuelve el iterable resultante.
• public AggregateIterable<T> batchSize(int bs): Aplica la cantidad máxima
de documentos a devolver por batch y devuelve el iterable resultante.
• public AggregateIterable<T> collation(Collation c): Aplica opciones de
collation y devuelve el iterable resultante. El objeto c puede ser nulo para
indicar que se aplicará la collation por defecto.
La interfaz AggregateIterable<T>: métodos propios
• public AggregateIterable<T> allowDiskUse(Boolean adu): Si adu no es nulo y su
valor es [Link], se permite la escritura en archivos temporales en el
servidor durante la ejecución del método aggregate. Una vez asignado este valor,
se devuelve el iterable resultante.
• public AggregateIterable<T> let(Bson vars): Declara variables para que sean
reconocidas por MongoDB en cualquier expresión Bson utilizada en la llamada a
aggregate. Luego devuelve el iterable resultante.
– El objeto vars puede ser nulo
• public AggregateIterable<T> bypassDocumentValidation(Boolean bdv): Si bdv no es
nulo y su valor es [Link] y en el pipeline del método aggregate existe al
menos una etapa $out o una $merge, no se validan los documentos resultantes que
se deseen guardar en una colección. Una vez asignado este valor, se devuelve el
iterable resultante.
La clase WriteModel<T>
• Esta clase abstracta, ubicada en el paquete
[Link], debe ser extendida por clases
cuyos objetos deben ser agregados en una lista de
operaciones de escritura masiva que será traspasada como
parámetro al método bulkWrite de un objeto MongoCollection.
• La clase está completamente vacía (salvo por un constructor
privado que recibe y hace nada) y solo sirve para poder
agregar instancias de clases que hereden de esta clase sin
tener que crear una lista por cada clase que se desee utilizar
La clase WriteModel<T>
• Las siguientes clases, pertenecientes al paquete
[Link] son extensiones de
WriteModel:
– DeleteOneModel<T>
– DeleteManyModel<T>
– InsertOneModel<T>
– UpdateOneModel<T>
– UpdateManyModel<T>
– ReplaceOneModel<T>
Las clases DeleteOneModel<T> y
DeleteManyModel<T>
• Estas clases sirven para definir un modelo para eliminar uno o todos los documentos,
respectivamente, que respeten un filtro opcional.
• Cada objeto DeleteOneModel<T> y DeleteManyModel<T> cuenta con un filtro para restringir
el(los) documento(s) a eliminar y opciones de eliminación. Ninguno de ellos pueden ser
nulos
• La única forma de setear ambos datos es por medio de los constructores:
– public DeleteOneModel<T>(Bson filter)
– public DeleteOneModel<T>(Bson filter, DeleteOptions opts)
– public DeleteManyModel<T>(Bson filter)
– public DeleteManyModel<T>(Bson filter, DeleteOptions opts)
• Una vez creado un objeto DeleteOneModel<T> o uno DeleteManyModel<T>, se puede
obtener su información con los siguientes métodos getter:
– public Bson getFilter()
– public DeleteOptions getOptions()
• Además, ambas clases sobrescriben el método toString de la clase Object.
La clase DeleteOptions
• Esta clase, ubicada en el paquete [Link],
permite establecer opciones al momento de eliminar uno o
varios documentos utilizando el driver de MongoDB desde
JAVA.
• La clase tiene un único constructor público, el constructor por
defecto.
• Cada objeto DeleteOptions contiene, entre otras cosas,
opciones opcionales de collation, un comentario opcional y cero
o varias variables que son definidas en la base de datos con el
operador $let.
La clase DeleteOptions
• Los miembros listados anteriormente se pueden obtener con los
siguientes métodos getter:
– public Collation getCollation()
– public BsonValue getComment()
– public Bson getLet()
• Además, esos mismos miembros pueden setearse “en cadena” con los
siguientes métodos. Los argumentos para cada uno pueden ser nulos:
– public DeleteOptions collation(Collation c)
– public DeleteOptions comment(BsonValue bv)
– public DeleteOptions let(Bson b)
• Además, la clase sobrescribe el método toString de la clase Object.
La clase InsertOneModel<T>
• Esta clase permite definir un modelo para insertar un simple
documento dentro de una operación de escritura masiva.
• Cada objeto InsertOneModel<T> cuenta con un objeto que es
instancia de una clase T conteniendo el documento a insertar.
• El objeto T no puede ser nulo y solo puede ser seteado para un
objeto InsertOneModel<T> al momento de ser creado con su único
constructor: public InsertOneModel<T>(T doc)
• Una vez seteado, el objeto T se puede obtener con el método public
T getDocument()
• La clase, además, sobrescribe el método toString de la clase Object.
La clase ReplaceOneModel<T>
• Esta clase permite definir un modelo para reemplazar un
simple documento por otro dentro de una operación de
escritura masiva.
• Cada objeto ReplaceOneModel<T> cuenta con un objeto
que es instancia de una clase T conteniendo el documento
a reemplazar, un filtro para determinar qué documento va a
ser reemplazado y opciones de reemplazo.
– Si el resultado del filtro es más de un documento, solo se
reemplazará el primero de ellos.
La clase ReplaceOneModel<T>
• Cada miembro listado anteriormente no puede ser nulo y solo puede
ser seteado para un objeto ReplaceOneModel<T> al momento de
ser creado con uno de los siguientes constructores:
– public ReplaceOneModel<T>(Bson filter, T replace)
– public ReplaceOneModel<T>(Bson filter, T replace, ReplaceOptions opts)
• Una vez seteados, los miembros pueden ser obtenidos con los
siguientes métodos getter:
– public Bson getFilter()
– public T getReplacement()
– Public ReplaceOptions getOptions()
• La clase, además, sobrescribe el método toString de la clase Object.
La clase ReplaceOptions
• Esta clase, ubicada en el paquete [Link], permite
establecer opciones al momento de reemplazar un documento
utilizando el driver de MongoDB desde JAVA.
• La clase tiene un único constructor público, el constructor por defecto.
• Cada objeto ReplaceOptions contiene, entre otras cosas, opciones
opcionales de collation, un comentario opcional, cero o varias variables
que son definidas en la base de datos con el operador $let, una
bandera booleana obligatoria para indicar si se debe insertar el
documento en caso de no encontrarse y una opcional para indicar si
debe ser validado o no al momento del reemplazo o inserción.
La clase ReplaceOptions
• Los miembros listados anteriormente se pueden obtener con los siguientes métodos
getter:
– public Collation getCollation()
– public BsonValue getComment()
– public Bson getLet()
– public boolean isUpsert()
– public Boolean getBypassDocumentValidation()
• Además, esos mismos miembros pueden setearse “en cadena” con los siguientes
métodos. Los argumentos para cada uno pueden ser nulos:
– public ReplaceOptions collation(Collation c)
– public ReplaceOptions comment(BsonValue bv)
– public ReplaceOptions let(Bson b)
– public ReplaceOptions upsert(boolean u)
– public ReplaceOptions bypassDocumentValidation(Boolean bdv)
• Además, la clase sobrescribe el método toString de la clase Object.
Las clases UpdateOneModel<T> y
UpdateManyModel<T>
• Estas clases sirven para definir un modelo para actualizar uno
o todos los documentos, respectivamente, que respeten un
filtro opcional.
• Cada objeto UpdateOneModel<T> y UpdateManyModel<T>
cuenta con un filtro para restringir el(los) documento(s) a
actualizar, los nuevos valores para el(los) campo(s)
especificado(s) del(los) documento(s) encontrados, una lista de
etapas que puede usarse en vez especificar los nuevos valores
directamente y opciones de actualización. El filtro y las
opciones no pueden ser nulos.
Las clases UpdateOneModel<T> y
UpdateManyModel<T>
• La única forma de setear los miembros mencionados anteriormente es por
medio de los constructores:
– public UpdateOneModel(Bson filter, Bson upd)
– public UpdateOneModel(Bson filter, Bson upd, UpdateOptions opts)
– public UpdateOneModel(Bson filter, List<? extends Bson> pipeline)
– public UpdateOneModel(Bson filter, List<? extends Bson> pipeline,
UpdateOptions opts)
– public UpdateManyModel(Bson filter, Bson upd)
– public UpdateManyModel(Bson filter, Bson upd, UpdateOptions opts)
– public UpdateManyModel(Bson filter, List<? extends Bson> pipeline)
– public UpdateManyModel(Bson filter, List<? extends Bson> pipeline,
UpdateOptions opts)
Las clases UpdateOneModel<T> y
UpdateManyModel<T>
• Una vez creado un objeto UpdateOneModel<T> o uno
UpdateManyModel<T>, se puede obtener su información
con los siguientes métodos getter:
– public Bson getFilter()
– public UpdateOptions getOptions()
– public Bson getUpdate()
– public List<? extends Bson> getUdatePipeline()
• Además, ambas clases sobrescriben el método toString
de la clase Object.
La clase UpdateOptions
• Esta clase, ubicada en el paquete [Link], permite
establecer opciones al momento de actualizar uno o varios
documentos utilizando el driver de MongoDB desde JAVA.
• La clase tiene un único constructor público, el constructor por defecto.
• Cada objeto UpdateOptions contiene, entre otras cosas, opciones
opcionales de collation, un comentario opcional, cero o varias variables
que son definidas en la base de datos con el operador $let, una
bandera booleana obligatoria para indicar si se debe insertar el
documento en caso de no encontrarse, una opcional para indicar si
debe ser validado o no al momento del reemplazo o inserción y cero o
varios filtros a aplicar a valores de campos que sean de tipo arreglo.
La clase UpdateOptions
• Los miembros listados anteriormente se pueden obtener con los siguientes métodos getter:
– public Collation getCollation()
– public BsonValue getComment()
– public Bson getLet()
– public boolean isUpsert()
– public Boolean getBypassDocumentValidation()
– public List<? extends Bson> getArrayFilters()
• Además, esos mismos miembros pueden setearse “en cadena” con los siguientes métodos.
Los argumentos para cada uno pueden ser nulos:
– public UpdateOptions collation(Collation c)
– public UpdateOptions comment(BsonValue bv)
– public UpdateOptions let(Bson b)
– public UpdateOptions upsert(boolean u)
– public UpdateOptions bypassDocumentValidation(Boolean bdv)
• Además, la clase sobrescribe el método toString de la clase Object.
La clase BulkWriteResult
• Esta clase abstracta, perteneciente al paquete
[Link], sebe ser extendida por clases que
deseen encapsular los resultados de una escritura hecha
a una o varias colecciones en la base de datos con el
método bulkWrite de la interfaz MongoCollection<T>
• El driver de MongoDB proporciona clases que son
extensiones de esta clase. Esas clases son
insignificantes para este documento
La clase BulkWriteResult: métodos
• public abstract boolean wasAcknowlegded(): Devuelve true
si la operación de escritura masiva fue creada de manera
tal que los resultados sean devueltos apenas el mensaje es
escrito al socket de conexión.
• public abstract int getInsertedCount(): Devuelve la cantidad
de documentos insertados por uno o varios objetos
UpdateOneModel<T>, UpdateManyModel<T> o
ReplaceOneModel<T> con el valor devuelto por isUpsert()
igual a true, o por uno o varios objetos InsertOneModel<T>.
La clase BulkWriteResult: métodos
• public abstract int getMatchedCount(): Devuelve la cantidad de
documentos encontrados por una o varias instancias de
UpdateOneModel<T>, UpdateManyModel<T> o ReplaceOneModel<T>.
– La cantidad incluye documentos que no han sido modificados.
• public abstract int getDeletedCount(): Devuelve la cantidad de
documentos eliminados por una o varias instancias de
DeleteOneModel<T> o DeleteManyModel<T>
• public abstract int getModifiedcount(): Devuelve la cantidad de
documentos modificados por una o varias instancias de
UpdateOneModel<T>, UpdateManyModel<T> o ReplaceOneModel<T>
La clase BulkWriteResult: métodos
• public abstract List<BulkWriteInsert> getInserts(): Devuelve una lista
inmodificable con los valores insertados por objetos InsertOneModel<T>.
– La lista puede estar vacía
– No se debe llamar a este método si el valor devuelto por wasAcknowledged() es
false o se lanzará una excepción.
• public abstract List<BulkWriteUpsert> getUpserts(): Devuelve una lista
inmodificable con los valores insertados por objetos UpdateOneModel<T>,
UpdateManyModel<T> y ReplaceOneModel<T> cuyo valor devuelto por
isUpsert() es true.
– La lista puede estar vacía
– No se debe llamar a este método si el valor devuelto por wasAcknowledged() es
false o se lanzará una excepción.
La clase BulkWriteResult: métodos
• public static BulkWriteResult acknowledged([Link] type, int matched,
Integer modified, List<BulkWriteUpsert> upserts, List<BulkWriteInserts> inserts): Crea
un objeto BulkWriteResult cuyo valor devuelto por wasAcknowledged() sea true con los
valores insertados especificados en inserts y upserts y la cantidad especificada de
documentos encontrados y modificados y especificando un tipo de escritura.
– Dependiendo del valor de type, la llamada a getInsertedCount(), getMatchedCount(),
getModifiedCount() y/o getDeletedCount() puede ser cero en vez de la cantidad especificada
en los parámetros de este método.
• public static BulkWriteResult acknowledged(int inserted, int matched, int removed,
Integer modified, List<BulkWriteUpsert> upserts, List<BulkWriteInserts> inserts): Igual
que el anterior, pero especificando una cantidad de documentos eliminados en vez de
un tipo de escritura.
– El objeto devuelto por este método y el anterior sobrescribe los métodos equals, hashCode y
toString de la clase Object.
La clase BulkWriteResult: métodos
• public static BulkWriteResult unacknowledged(): Crea un
objeto BulkWriteResult cuyo valor devuelto por
wasAcknowledged() sea false y que lance una excepción
cada vez que se llame a todos los métodos heredados
directamente de BulkWriteResult y que no hayan sido
sobrescrituras de métodos de ninguna otra clase.
– El objeto devuelto sobrescribe los métodos equals, hashCode y
toString de la clase Object
La clase WriteRequest
• Esta clase abstracta, ubicada en el paquete
[Link], debe ser extendida por clases que se
desee que sean utilizadas para implementar una petición
de escritura.
• Esta clase contiene un único método abstracto llamado
public abstract [Link] getType()
• Además, la clase contiene una enumeración pública interna
llamada Type que define las siguientes constantes para los
tipos de escritura: INSERT, UPDATE, REPLACE y
DELETE.
Las clases BulkWriteUpsert y BulkWriteInsert
• Ambas clases, ubicadas en el paquete [Link],
representan un item que fue insertado usando el método bulkWrite
de MongoCollection<T>.
– Para BulkWriteInsert, la inserción se hizo con un objeto
InsertOneModel<T>
– Para BulkWriteUpsert, la modificación se hizo con un objeto
ReplaceOneModel<T>, UpdateOneModel<T> o UpdateManyModel<T>
cuyo valor devuelto por isUpsert() es true.
• Cada objeto BulkWriteUpsert y BulkWriteInsert contiene un índice
en la lista pasada como parámetro a bulkWrite en la que la
correspondiente operación ocurrió y la id del documento insertado
Las clases BulkWriteUpsert y BulkWriteInsert
• Ambos miembros solo pueden ser seteados al momento de crear
un BulkWriteUpsert o BulkWriteInsert por medio de sus
respectivos constructores:
– public BulkWriteUpsert(int index, BsonValue id)
– public BulkWriteInsert(int index, BsonValue id)
• Una vez creados los objetos, sus miembros se pueden obtener
con los siguientes métodos getter:
– public int getIndex()
– public BsonValue getId()
• Además, ambas clases tienen su propia sobrescritura de los
métodos equals, hashCode y toString de la clase Object.
La clase BulkWriteOptions
• Esta clase, ubicada en el paquete [Link]
permite establecer opciones al momento de ejecutar una escritura
masiva (inserción, actualización, reemplazo y/o eliminación)
• La clase cuenta con un único constructor, el constructor por
defecto.
• Cada objeto BulkWriteOptions cuenta con una bandera para
indicar si las operaciones se realizan en el orden especificado
(cuyo valor por defecto es true), una para indicar si se pasan por
alto las validaciones en cada operación, un comentario y cero o
más variables declaradas con el operador $let
La clase BulkWriteOptions
• Los miembros mencionados anteriormente pueden ser obtenidos con los
siguientes métodos getter:
– public boolean isOrdered()
– public Boolean getBypassDocumentValidation()
– public BsonValue getComment()
– public Bson getLet()
• Los mismos miembros pueden ser seteados “en cadena” con los siguientes
métodos:
– public BulkWriteOptions ordered(boolean o)
– public BulkWriteOptions bypassDocumentValidation(Boolean bdv)
– public BulkWriteOptions comment(BsonValue c)
– public BulkWriteOptions let(Bson l)
• Además, la clase sobrescribe el método toString de la clase Object
La clase InsertOneResult
• Esta clase abstracta, perteneciente al paquete
[Link], sebe ser extendida por clases que
deseen encapsular los resultados de una escritura hecha
a una colección en la base de datos con el método
insertOne de la interfaz MongoCollection<T>
• El driver de MongoDB proporciona clases que son
extensiones de esta clase. Esas clases son
insignificantes para este documento
La clase InsertOneResult: métodos
• public abstract boolean wasAcknowledged(): Igual que el método del mismo
nombre de la clase BulkWriteResult
• public abstract BsonValue getInsertId(): Obtiene el valor del campo _id del
documento insertado. Si ese campo no está disponible, se devuelve null.
• public static InsertOneResult acknowledged(BsonValue id): Crea un objeto
InsertOneResult con el valor devuelto por wasAcknowledged() igual a true con
el id especificado.
– El objeto id puede ser nulo
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase
Object
• public static InsertOneResult unacknowledged(): Crea un objeto
InsertOneResult con el valor devuelto por wasAcknowledged igual a false y que
lanzará una excepción si se intenta llamar al método getInsertedId() de ese
objeto:
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase
Object
La clase InsertOneOptions
• Esta clase, ubicada en el paquete [Link], permite
especificar opciones al momento de insertar un único documento.
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto cuenta con una bandera booleana para indicar si se ignora la
validación a documentos insertados y un objeto para indicar los comentarios.
– Ambos miembros pueden ser nulos
• Ambos miembros pueden obtenerse con los siguientes métodos getter:
– public Boolean getBypassDocumentValidation()
– public BsonValue getComment()
• Además, los miembros se pueden setear en cadena con los siguientes métodos:
– public InsertOneOptions bypassDocumentValidation(Boolean bdv)
– public InsertOneOptions comment(BsonValue bv)
• Además, la clase sobrescribe el método toString de la clase Object.
La clase InsertManyResult
• Esta clase abstracta, perteneciente al paquete
[Link], sebe ser extendida por clases que
deseen encapsular los resultados de una escritura hecha
a una colección en la base de datos con el método
insertMany de la interfaz MongoCollection<T>
• El driver de MongoDB proporciona clases que son
extensiones de esta clase. Esas clases son
insignificantes para este documento
La clase InsertOneResult: métodos
• public abstract boolean wasAcknowledged(): Igual que el método del mismo nombre de
la clase BulkWriteResult
• public abstract Map<Integer, BsonValue> getInsertIds(): Obtiene el valor del campo _id
de todos los documentos insertados.
– Si para un documento insertado ese campo no está disponible, se devuelve null.
• public static InsertManyResult acknowledged(Map<Integer, BsonValue> ids): Crea un
objeto InsertManyResult con el valor devuelto por wasAcknowledged() igual a true con
todos los ids en la lista especificada.
– El objeto id para un elemento en ids puede ser nulo
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase Object
• public static InsertManyResult unacknowledged(): Crea un objeto InsertManyResult con
el valor devuelto por wasAcknowledged igual a false y que lanzará una excepción si se
intenta llamar al método getInsertedId() de ese objeto:
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase Object
La clase InsertManyOptions
• Esta clase, ubicada en el paquete [Link], permite especificar opciones al
momento de insertar dos o más documentos a la vez con insertMany.
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto cuenta con una bandera booleana para indicar si se ignora la validación a
documentos insertados, un objeto para indicar los comentarios y una bandera booleana para
indicar si las inserciones se hicieron en orden.
– Ambos miembros excepto el último pueden ser nulos
• Los miembros pueden obtenerse con los siguientes métodos getter:
– public Boolean getBypassDocumentValidation()
– public BsonValue getComment()
– public boolean isOrdered()
• Además, los miembros se pueden setear en cadena con los siguientes métodos:
– public InsertManyOptions bypassDocumentValidation(Boolean bdv)
– public InsertManyOptions comment(BsonValue bv)
– public InsertManyOptions ordered(boolean o)
• Además, la clase sobrescribe el método toString de la clase Object.
La clase DeleteResult
• Esta clase abstracta, perteneciente al paquete
[Link], sebe ser extendida por clases que
deseen encapsular los resultados de una eliminación de
documentos hecha a una colección en la base de datos
con los métodos deleteOne o deleteMany de la interfaz
MongoCollection<T>
• El driver de MongoDB proporciona clases que son
extensiones de esta clase. Esas clases son
insignificantes para este documento
La clase DeleteResult: métodos
• public abstract boolean wasAcknowledged(): Igual que el método del mismo nombre
de la clase BulkWriteResult
• public abstract long getDeletedCount(): Obtiene la cantidad de documentos
eliminados
• public static DeleteResult acknowledged(long deleted): Crea un objeto DeleteResult
con el valor devuelto por wasAcknowledged() igual a true con la cantidad
especificada de documentos eliminados.
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase
Object
• public static DeleteResult unacknowledged(): Crea un objeto DeleteResult con el
valor devuelto por wasAcknowledged igual a false y que lanzará una excepción si
se intenta llamar al método getDeletedCount() de ese objeto:
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase
Object
La clase UpdateResult
• Esta clase abstracta, perteneciente al paquete
[Link], sebe ser extendida por clases que
deseen encapsular los resultados de una modificación de
documentos hecha a una colección en la base de datos
con los métodos updateOne, updateMany o replaceOne
de la interfaz MongoCollection<T>
• El driver de MongoDB proporciona clases que son
extensiones de esta clase. Esas clases son
insignificantes para este documento
La clase UpdateResult: métodos
• public abstract boolean wasAcknowledged(): Igual que el método del
mismo nombre de la clase BulkWriteResult
• public abstract long getMatchedCount(): Obtiene la cantidad de
documentos encontrados, incluyendo aquellos que no fueron
modificados
• public abstract long getModifiedCount(): Obtiene la cantidad de
documentos modificados
• public abstract BsonValue getUpsertedId(): Si la operación es un
reemplazo con upsert igual a true y un documento fue insertado como
consecuencia, se devuelve un objeto con la id del documento insertado.
En caso contrario, se devuelve null.
La clase UpdateResult: métodos
• public static UpdatedResult acknowledged(long matched, Long modified,
BsonValue upsertedId): Crea un objeto UpdateResult con el valor devuelto
por wasAcknowledged() igual a true con las cantidades especificadas en
matched y modified y la id especificada en upsertedId.
– Los objetos modified y upsertedId pueden ser nulos.
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase
Object
• public static UpdateResult unacknowledged(): Crea un objeto UpdateResult
con el valor devuelto por wasAcknowledged igual a false y que lanzará una
excepción si se intenta llamar al método getDeletedCount() de ese objeto:
– El objeto devuelto sobrescribe los métodos equals, hashCode y toString de la clase
Object
La clase FindOneAndDeleteOptions
• Esta clase, ubicada en el paquete [Link], permite
establecer opciones al llamar al método findOneAndDelete de
MongoCollection.
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto contiene, entre otras cosas, un documento de proyección
(para indicar qué campos mostrar del documento encontrado), un
documento de ordenamiento (para indicar bajo qué campo(s) ordenar
el resultado de búsqueda si es que tiene 2 o más documentos), el
tiempo máximo de ejecución en milisegundos, un objeto con opciones
de collation, un objeto con comentarios y cero o más variables
declaradas con el operador $let.
La clase FindOneAndDeleteOptions
• Los miembros mencionados anteriormente se pueden
obtener con los siguientes métodos getter:
– public Bson getProjection()
– public Bson getSort()
– public long getMaxTime(TimeUnit tu)
– public Collation getCollation()
– public BsonValue getComment()
– public Bson getLet()
La clase FindOneAndDeleteOptions
• Dichos miembros pueden setearse en cadena con los
siguientes métodos:
– public FindAndDeleteOptions projection(Bson p)
– public FindAndDeleteOptions sort(Bson s)
– public FindAndDeleteOptions maxTime(long mt, TimeUnit tu)
– public FindAndDeleteOptions collation(Collation c)
– public FindAndDeleteOptions comment(BsonValue bv)
– public FindAndDeleteOptions let(Bson l)
• Además, la clase sobrescribe el método toString de la clase
Object.
La clase FindOneAndReplaceOptions
• Esta clase, ubicada en el paquete [Link], permite establecer
opciones al llamar al método findOneAndReplace de MongoCollection.
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto contiene, entre otras cosas, un documento de proyección (para indicar
qué campos mostrar del documento encontrado), un documento de ordenamiento
(para indicar bajo qué campo(s) ordenar el resultado de búsqueda si es que tiene 2
o más documentos), el tiempo máximo de ejecución en milisegundos, un objeto con
opciones de collation, un objeto con comentarios , cero o más variables declaradas
con el operador $let, una bandera booleana para indicar si se debe insertar un
documento en caso de no encontrarse uno, otra bandera booleana (que puede ser
nula) para indicar que no se deben validar documentos nuevos o modificados y un
objeto no nulo para indicar qué documento devolver una vez realizada la
modificación o inserción.
La clase FindOneAndReplaceOptions
• Los miembros mencionados anteriormente se pueden obtener
con los siguientes métodos getter:
– public Bson getProjection()
– public Bson getSort()
– public long getMaxTime(TimeUnit tu)
– public Collation getCollation()
– public BsonValue getComment()
– public Bson getLet()
– public boolean getUpsert()
– public Boolean getBypassDocumentValidation()
– public ReturnDocument getReturnDocument()
La clase FindOneAndReplaceOptions
• Dichos miembros pueden setearse en cadena con los siguientes
métodos:
– public FindAndReplaceOptions projection(Bson p)
– public FindAndReplaceOptions sort(Bson s)
– public FindAndReplaceOptions maxTime(long mt, TimeUnit tu)
– public FindAndReplaceOptions collation(Collation c)
– public FindAndReplaceOptions comment(BsonValue bv)
– public FindAndReplaceOptions let(Bson l)
– public FindAndReplaceOptions upsert(boolean u)
– public FindAndReplaceOptions bypassDocumentValidation(Boolean bdv)
– public FindAndReplaceOptions returnDocument(ReturnDocument rd)
• Además, la clase sobrescribe el método toString de la clase Object.
La enumeración ReturnDocument
• Esta enumeración, ubicada en el paquete
[Link], sirve para indicar qué
documento devolver con una llamada a
findOneAndReplace:
– BEFORE: Devolver el documento original
– AFTER: Devolver el documento resultante de la modificación o
inserción.
La clase FindOneAndUpdateOptions
• Esta clase, ubicada en el paquete [Link], permite establecer
opciones al llamar al método findOneAndUpdate de MongoCollection.
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto contiene, entre otras cosas, un documento de proyección (para indicar
qué campos mostrar del documento encontrado), un documento de ordenamiento
(para indicar bajo qué campo(s) ordenar el resultado de búsqueda si es que tiene 2
o más documentos), el tiempo máximo de ejecución en milisegundos, un objeto con
opciones de collation, un objeto con comentarios , cero o más variables declaradas
con el operador $let, una bandera booleana para indicar si se debe insertar un
documento en caso de no encontrarse uno, otra bandera booleana (que puede ser
nula) para indicar que no se deben validar documentos nuevos o modificados, un
objeto no nulo para indicar qué documento devolver una vez realizada la
modificación o inserción y una lista de filtros a aplicar a campos de tipo arreglo.
La clase FindOneAndUpdateOptions
• Los miembros mencionados anteriormente se pueden obtener con
los siguientes métodos getter:
– public Bson getProjection()
– public Bson getSort()
– public long getMaxTime(TimeUnit tu)
– public Collation getCollation()
– public BsonValue getComment()
– public Bson getLet()
– public boolean getUpsert()
– public Boolean getBypassDocumentValidation()
– public ReturnDocument getReturnDocument()
– public List<? Extends Bson> getArrayFilters()
La clase FindOneAndUpdateOptions
• Dichos miembros pueden setearse en cadena con los siguientes
métodos:
– public FindAndUpdateOptions projection(Bson p)
– public FindAndUpdateOptions sort(Bson s)
– public FindAndUpdateOptions maxTime(long mt, TimeUnit tu)
– public FindAndUpdateOptions collation(Collation c)
– public FindAndUpdateOptions comment(BsonValue bv)
– public FindAndUpdateOptions let(Bson l)
– public FindAndUpdateOptions upsert(boolean u)
– public FindAndUpdateOptions bypassDocumentValidation(Boolean bdv)
– public FindAndUpdateOptions returnDocument(ReturnDocument rd)
– public FindAndUpdateOptions arrayFilters(List<? Extends Bson> af)
• Además, la clase sobrescribe el método toString de la clase Object.
La clase DropCollectionOptions
• Esta clase, ubicada en el paquete [Link]
permite establecer opciones al eliminar una colección de la base
de datos
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto cuenta con un objeto conteniendo campos
encriptados explícitamente seteados que puede obtenerse o
setearse con:
– public Bson getEncryptedFields()
– public DropCollectionOptions encryptedFields(Bson ef)
• Además, la clase sobrescribe el método toString de la clase
Object.
La clase RenameCollectionOptions
• Esta clase, ubicada en el paquete [Link] permite
establecer opciones al renombrar una colección de la base de datos (y
cambiarla a otra base de datos si es necesario)
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto cuenta con una bandera booleana para indicar si, en caso de
que en la misma base de datos especificada en la namespace exista una
colección con nombre igual al nuevo nombre que tendrá la colección
deseada, elimine esa colección antes del renombramiento. Dicha bandera se
puede obtener o setear con:
– public boolean isDropTarget()
– public RenameCollectionOptions dropTarget(boolean dt)
• Además, la clase sobrescribe el método toString de la clase Object.
Clases Helper
Clases Helper
• MongoDB proporciona “Clases Helper” para crear objetos Bson cuyo
contenido está permitido para ciertos parámetros de algunos métodos
de la clase MongoCollection
• Estas clases tienen en común las siguientes características:
• Pertenecen al paquete [Link]
• No tienen constructores públicos y no es necesario que lo tengan
• Todos sus métodos son públicos y estáticos
• Todos los métodos devuelven una instancia de Bson, salvo una
excepción
• El uso del objeto devuelto depende de la clase a la que pertenece el
método que devuelve el objeto.
Clases Helper
• En este documento se verán las siguientes clases helper proporcionadas por
MongoDB:
• Filters:
• Los objetos Bson devueltos por los métodos de esta clase consisten en filtros utilizados al
buscar y/o actualizar uno o varios documentos de una colección.
• Cada objeto Bson indica el campo en la colección, el operador y el valor que se debe
satisfacer dependiendo del operador especificado.
• Dos o más objetos Bson generados desde esta clase pueden combinarse para formar un único
objeto Bson
• Updates:
• Cada objeto Bson devuelto por un método de esta clase consiste en una modificación sobre un
campo en uno o más documentos de una colección, indicando el campo, el operador y el
nuevo valor que debe tener el campo para el/los documento(s) encontrado(s) dependiendo del
operador especificado
• Dos o más objetos Bson generados desde esta clase pueden combinarse para formar un único
objeto Bson
Clases Helper
• En este documento se verán las siguientes clases helper (cont.)
 Aggregates:
 Cada objeto Bson devuelto por un método de esta clase representa una etapa utlizada en
una llamada al método aggregate de la interfaz MongoCollection, indicando el nombre de la
etapa y los argumentos apropiados para esa etapa
 Projections
 Cada objeto Bson devuelto por un método de esta clase representa un argumento válido
para el método project de la clase Aggregates.
 Sorts
 Cada objeto Bson devuelto por un método de esta clase representa un criterio de
ordenamiento válido para ser utilizado por el método sort de la clase Aggregates.
Clases Helper
• En este documento se verán las siguientes clases helper (cont.)
 Accumulators
 Los objetos devueltos por los métodos de esta clase son instancias de
BsonField representando acumuladores utilizados por el método group de
Aggregates (o cualquier etapa que admita un acumulador, dependiendo de
la etapa).
• También se indicarán las clases, interfaces y enumeraciones utilizadas por algunos métodos
de las clases Helper que no hayan sido explicadas anteriormente en este documento.
La clase Filters: métodos
• public static Bson eq(T val): Crea un filtro para obtener un único
documento cuyo _id sea igual a val.
– El parámetro val puede ser nulo
• public static Bson eq(String key, T val): Crea un filtro para obtener todos
los documentos cuyo campo con clave key sea igual a val.
– El parámetro val puede ser nulo
• public static Bson ne(String key, T val): Crea un filtro para obtener todos
los documentos cuyo campo con clave key sea distinto de val.
– El parámetro val puede ser nulo
• public static Bson gt(String key, T val): Crea un filtro para obtener todos
los documentos cuyo campo con clave key sea mayor que val.
– El parámetro val puede ser nulo
La clase Filters: métodos
• public static Bson lt(String key, T val): Crea un filtro para obtener todos los
documentos cuyo campo con clave key sea menor que val.
– El parámetro val puede ser nulo
• public static Bson gte(String key, T val): Crea un filtro para obtener todos los
documentos cuyo campo con clave key sea mayor o igual que val.
– El parámetro val puede ser nulo
• public static Bson lte(String key, T val): Crea un filtro para obtener todos los
documentos cuyo campo con clave key sea menor o igual que val.
– El parámetro val puede ser nulo
• public static Bson in(String key, T... vals): Crea un filtro para obtener todos los
documentos cuyo campo con clave key sea igual a cualquiera de los valores
especificados en vals.
– El parámetro vals es opcional y puede ser un arreglo vacío de tipo T.
La clase Filters: métodos
• public static Bson in(String key, Iterable<T> vals): Igual al anterior,
pero con los valores en vals guardados en una instancia de cualquier
clase que implemente la interfaz Iterable<T>.
• public static Bson nin(String key, T... vals): Crea un filtro para obtener
todos los documentos cuyo campo con clave key sea ningún valor
especificado en vals.
– El parámetro vals es opcional y puede ser un arreglo vacío de tipo T.
• public static Bson nin(String key, Iterable<T> vals): Igual al anterior,
pero con los valores en vals guardados en una instancia de cualquier
clase que implemente la interfaz Iterable<T>.
La clase Filters: métodos
• public static Bson and(Iterable<Bson> filters): Crea un filtro que consiste en un Y lógico
entre todos los filtros especificados.
– Cada elemento en filters debe ser cualquier objeto devuelto por cualquier método de la clase
Filters, incluyendo este.
• public static Bson and(Bson... filters): Igual al anterior, pero con uno o más parámetros que
son objetos Bson.
– Cada elemento en filters debe ser cualquier objeto devuelto por cualquier método de la clase Filters, incluyendo este.
• public static Bson or(Iterable<Bson> filters): Crea un filtro que consiste en un O lógico entre
todos los filtros especificados.
– Cada elemento en filters debe ser cualquier objeto devuelto por cualquier método de la clase
Filters, incluyendo este.
• public static Bson or(Bson... filters): Igual al anterior, pero con uno o más parámetros que
son objetos Bson.
– Cada elemento en filters debe ser cualquier objeto devuelto por cualquier método de la clase
Filters, incluyendo este.
La clase Filters: métodos
• public static Bson not(Bson filter): Crea un filtro con la negación del
filtro especificado.
• public static Bson nor(Bson... filters): Llamar a este método equivale
a llamar a [Link]([Link](filters))
• public static Bson nor(Iterable<Bson> filters): Igual al anterior pero
con todos los filtros guardados en una instancia de cualquier clase
que implemente la interfaz Iterable.
• public static Bson exists(String key, boolean e): Crea un filtro para
obtener todos los documentos que contengan el campo con la clave
especificada en key si e es true, o que no lo contengan si e es false.
La clase Filters: métodos
• public static Bson exists(String key): Llamar a este método equivale
a llamar a [Link](key, true)
• public static Bson type(String key, BsonType type): Crea un filtro
para obtener todos los documentos cuyo campo key sea del tipo
especificado en type.
• public static Bson type(String key, String type): Igual que el anterior,
pero con el tipo de dato traspasado como un String.
• public static Bson mod(String key, long div, long res): Crea un filtro
para obtener todos los documentos en los que el resto de la división
entera entre el valor del campo key y el divisor div sea igual a res.
La clase Filters: métodos
• public static Bson regex(String key, String val): Crea un filtro para obtener todos
los documentos en los que el valor del campo key coincida con la expresión
regular especificada en val.
• public static Bson regex(String key, String val, String opts): Igual que el anterior,
pero aplicando las opciones especificadas
– El parámetro opts puede ser nulo
• public static Bson regex(String key, Pattern p): Llamar a este método es
equivalente a llamar a [Link](key, [Link]())
– El objeto p no puede ser nulo.
• public static Bson text(String s): Crea un filtro para obtener todos los
documentos en los que el valor de al menos uno de sus campos contenga el
texto especificado en s.
– El string s no puede ser nulo.
La clase Filters: métodos
• public static Bson text(String s, TextSearchOptions opts):
Igual que el anterior, pero aplicando las opciones
especificadas en opts.
– El string s no puede ser nulo.
• public static Bson where(String script): Crea un filtro para
obtener todos los documentos que cumplan con lo
especificado en script.
– El parámetro script no puede ser nulo y debe ser una expresión
codificada en lenguaje JavaScript.
La clase Filters: métodos
• public static Bson expr(T exp): Crea un filtro para obtener todos los
documentos que cumplan con la expresión especificada.
– T representa cualquier clase que permita representar una expresión, como
Bson.
• public static Bson all(String key, T... vals): Crea un filtro para obtener
todos los documentos cuyo valor del campo key sea un arreglo
conteniendo todos los elementos en vals.
• public static Bson elemMatch(String key, Bson afilter): Crea un filtro
para obtener todos los documentos cuyo valor del campo key sea
un arreglo conteniendo al menos un elemento que cumpla con el
filtro especificado en afilter.
La clase Filters: métodos
• public static Bson size(String key, int c): Crea un filtro
para obtener todos los documentos cuyo valor del campo
key sea un arreglo de largo c.
• public static Bson jsonSchema(Bson s): Crea un filtro
para obtener todos los documentos que sean válidos
según el esquema especificado en s.
• public static Bson empty(): Crea un filtro vacío,
permitiendo que se obtengan todos los documentos.
La clase TextSearchOptions
• Esta clase, ubicada en el paquete [Link],
permite establecer opciones a aplicar al momento de llamar al
método text de la clase Filters.
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto contiene un lenguaje, una bandera booleana para
indicar si se distingue entre mayúsculas y minúsculas y otra
para indicar si se distingue entre caracteres con o sin acentos y,
si los dos caracteres tienen acentos, cuál tiene precedencia.
– Todos los miembros pueden ser nulos.
La clase TextSearchOptions
• Los miembros mencionados anteriormente se pueden obtener con los
siguientes métodos getter:
– public String getLanguage()
– public Boolean getCaseSensitive()
– public Boolean getDiacriticSensitive()
• Los miembros pueden setearse en cadena con los siguientes métodos:
– public TextSearchOptions language(String l)
– public TextSearchOptions caseSensitive(Boolean cs)
– public TextSearchOptions diacriticSensitive(Boolean ds)
• Además, la clase sobrescribe los métodos equals, hashCode y toString
de la clase Object.
La clase Updates: métodos
• public static Bson combine(Bson... upds): Combina uno o más
objetos Bson indicando actualizaciones y devuelve el resultado de
la combinación
– Los objetos pasados como parámetro deben ser objetos Bson
devueltos por cualquier método de la clase Updates, incluyendo este.
– Útil cuando se desea hacer dos o más actualizaciones a la vez al o a
los documentos encontrados.
• public static Bson combine(List<? Extends Bson> upds): Igual que
el anterior, pero los objetos a combinar están guardados en una
instancia de cualquier clase que implemente la interfaz List.
La clase Updates: métodos
• public static Bson set(String key, T val): Crea un objeto Bson para
indicar que para todos los documentos encontrados, el valor del
campo key debe ser igual a val.
– El parámetro val puede ser nulo
• public static Bson unset(String key): Crea un objeto Bson para
indicar que para todos los documentos encontrados se debe
eliminar el campo key con su valor.
• public static Bson setOnInsert(Bson values): Crea un objeto Bson
para indicar que si la operación insertó un documento debido a que
se indicó un upsert igual a true, setee los valores a los campos
especificados en values para el documento insertado.
La clase Updates: métodos
• public static Bson setOnInsert(String key, T val): Crea un objeto
Bson para indicar que si la operación insertó un documento
debido a que se indicó un upsert igual a true, setee el valor del
campo especificado en key igual a val para el documento
insertado.
– El parámetro val puede ser nulo.
• public static Bson rename(String oldname, String newname):
Crea un objeto Bson para indicar que para todos los
documentos encontrados, reemplace el nombre del campo
oldname por newname.
La clase Updates: métodos
• public static Bson inc(String key, Number val): Crea un objeto Bson
para indicar que para todos los documentos encontrados, incremente
(o disminuya, dependiendo del signo) el valor del campo key por el
valor de val.
• public static Bson mul(String key, Number val): Crea un objeto Bson
para indicar que para todos los documentos encontrados, multiplique el
valor del campo key por el valor de val.
• public static Bson min(String key, T val): Crea un objeto Bson para
indicar que para cada documento encontrado, si el valor val es menor
que el del del campo key para ese documento, asigne val a ese campo.
La clase Updates: métodos
• public static Bson max(String key, T val): Crea un objeto Bson
para indicar que para cada documento encontrado, si el valor
de val es mayor que el del campo key para ese documento,
asigne val a ese campo.
• public static Bson currentDate(String key): Crea un objeto Bson
para indicar que para todos los documentos encontrados,
asigne al campo key la fecha actual como un Date de BSON.
• public static Bson currentTimestamp(String key): Igual que el
anterior, pero guardando la fecha como un Timestamp.
La clase Updates: métodos
• public static Bson addToSet(String key, T val): Crea un objeto Bson para indicar que
para cada documento encontrado, si el campo key para ese documento es un
arreglo y val no está presente en el arreglo, agregar ese valor al arreglo.
– El parámetro val puede ser nulo mientras se respete lo indicado arriba.
• public static Bson addEachToSet(String key, List<T> vals): Llamar a este método
equivale, para cada elemento “e” en vals, a llamar a [Link](key, e).
• public static Bson push(String key, T val): Igual que addToSet, con la diferencia de
que push agrega el elemento incluso si ya existe en el arreglo.
– El parámetro val puede ser nulo.
• public static Bson pushEach(String key, List<T> vals): Igual que addEachToSet, con
la diferencia de que pushEach agrega cada elemento incluso si ya existe en el
arreglo
• public static Bson pushEach(String key, List<T> vals, PushOptions opts): Igual que
el anterior, pero aplicando opciones de inserción de elementos en el arreglo.
La clase Updates: métodos
• public static Bson pull(String key, T val): Crea un objeto Bson para indicar que para
cada documento encontrado, si el campo key para ese documento es un arreglo, se
deben quitar del arreglo todas las ocurrencias de val.
– El parámetro val puede ser nulo.
• public static Bson pullByFilter(Bson filter): Crea un objeto Bson para indicar que para
cada documento encontrado, si el campo key para ese documento es un arreglo, se
deben eliminar todos los elementos que cumplan con el filtro especificado.
• public static Bson pullAll(String key, List<T> vals): Llamar a este método equivale, para
cada elemento e en vals, a llamar a [Link](key, e)
• public static Bson popFirst(String key): Crea un objeto Bson para indicar que para cada
documento encontrado, si el campo key para ese documento es un arreglo, se debe
remover el primer elemento de éste.
• public static Bson popLast(String key): Igual que el anterior, pero removiendo el último
elemento del arreglo en lugar del primero.
La clase Updates: métodos
• public static Bson bitwiseAnd(String key, int val): Crea un objeto Bson para indicar
que para cada documento encontrado, su nuevo valor debe ser igual a un AND a
nivel de bit entre su valor actual integral y el valor de val.
• public static Bson bitwiseAnd(String key, long val): Igual al anterior, pero con un val
de tipo long
• public static Bson bitwiseOr(String key, int val): Igual a bitwiseAnd, pero calculando
un OR a nivel de bit.
• public static Bson bitwiseOr(String key, long val): Igual al anterior, pero con un val
de tipo long
• public static Bson bitwiseXor(String key, int val): Igual a bitwiseAnd, pero calculando
un XOR (OR exclusivo) a nivel de bit.
• public static Bson bitwiseXor(String key, long val): Igual al anterior, pero con un val
de tipo long
La clase PushOptions
• Esta clase, ubicada en el paquete [Link], permite
establecer opciones al agregar elementos a un campo que es de tipo arreglo
usando el método push de la clase Updates
• La clase tiene un único constructor, el constructor por defecto.
• Cada objeto tiene un número indicando la posición a partir de la cual agregar
los nuevos valores, un número indicando el límite máximo de elementos que
debe tener el arreglo, un número indicando la dirección en que se deben
ordenar los elementos del arreglo que no sean documentos (1 para orden
ascendente, -1 para orden descendente) y un documento indicando la
dirección en que se deben ordenar los elementos que sí son documentos.
– Todos los miembros mencionados pueden ser nulos
La clase PushOptions
• Cada miembro se puede obtener llamando a los siguientes métodos getter:
– public Integer getPosition()
– public Integer getSlice()
– public Integer getSort()
– public Bson sortDocument()
• Además, los miembros se pueden setear en cadena con los siguientes
métodos:
– public PushOptions position(Integer pos)
– public PushOptions slice(Integer limit)
– public PushOptions sort(Integer s)
– public PushOptions sortDocument(Bson sd)
• Además, la clase sobrescribe los métodos equals, hashCode y toString de la
clase Object
La clase Aggregates: métodos
• public static Bson addFields(Field<?>... fields): Crea un objeto
Bson representando la etapa $addFields y pasando los campos
especificados en fields con sus respectivos valores.
• public static Bson addFields(List<Field<?>> fields): Igual que el
anterior, pero todos los campos están en una lista.
• public static Bson set(Field<?>… fields): Crea un objeto Bson
representando la etapa $set y pasando los campos
especificados en fields con sus respectivos valores.
• public static Bson set(List<Field<?>> fields): Igual que el
anterior, pero todos los capos están en una lista.
La clase Aggregates: métodos
• public static Bson count(String field): Crea un objeto Bson
representando la etapa $count sobre un campo específico y
especificando el nombre del campo de salida que tendrá la cantidad
obtenida.
• public static Bson count(): Llamar a este método equivale a llamar a
[Link](“count”)
• public static Bson match(Bson filter): Crea un objeto Bson
representando la etapa $match y pasando un objeto Bson para ser
utilizado para filtrar documentos de la colección o la etapa anterior.
 El objeto filter debe ser cualquier objeto Bson devuelto por un
método de la clase Filters.
La clase Aggregates: métodos
• public static Bson project(Bson p): Crea un objeto Bson representando la etapa
$project y pasando un objeto de proyección.
 El objeto p debe ser un objeto Bson devuelto por cualquier método de la
clase Projections
• public static Bson sort(Bson s): Crea un objeto Bson representando la etapa
$sort y pasando un criterio de ordenamiento
 El objeto s debe ser un objeto Bson devuelto por cualquier método de la
clase Sorts.
• public static Bson sortByCount(T filter): Crea un objeto Bson representando la
etapa $sortByCount y pasando un filtro, que puede ser un String con el nombre
de un campo de la colección o etapa anterior (anteponiendo el $) o un objeto
Bson indicando una operación con uno o más campos.
La clase Aggregates: métodos
• public static Bson skip(int s): Crea un objeto Bson representando la etapa
$skip y pasando la cantidad de documentos a descartar de la colección o
etapa anterior.
• public static Bson limit(int l): Crea un objeto Bson representando la etapa
$limit y pasando la cantidad de documentos a conservar de la colección o
etapa anterior.
• public static Bson lookup(String from, String local, String foreign, String as):
Crea un objeto Bson representando la etapa $lookup y pasando un String
con la colección con los documentos a embeber, uno con el campo de la
colección o etapa anterior, uno con el campo de la colección especificada en
from y uno con el campo con los documentos embebidos que tendrá la
salida de la etapa $lookup.
La clase Aggregates: métodos
• public static Bson lookup(String from, List<Variable<T>>
vars, List<? extends Bson> pipeline, String as): Crea un
objeto Bson representando la etapa $lookup y pasando
un String con la colección con los documentos a embeber,
un lista de variables (con sus valores) a ser declaradas
con el operador $let, una lista de etapas reconocidas por
aggregate que puedan ser usadas desde $lookup y el
campo en la salida de $lookup con los documentos
embebidos desde la colección from.
La clase Aggregates: métodos
• public static Bson lookup(String from, List<? extends Bson> pipeline, String as):
Igual al anterior, pero sin declarar variables.
• public static Bson facet(List<Facet> fs): Devuelve un objeto Bson representando la
etapa $facet y pasando una lista de facetas, donde cada faceta contiene una clave
y un conjunto de etapas.
• public static Bson group(T id, BsonField... accms): Devuelve un objeto Bson
representando la etapa $group y pasando como parámetros una instancia de una
clase T indicando el campo o expresión a usar para la agrupación y los campos
acumuladores, cada uno en función de los campos de cada documento de la
colección o la etapa anterior.
• El campo id puede ser nulo
• Los objetos en accms deben haber sido devueltos por una llamada a cualquier
método de la clase Accumulators
La clase Aggregates: métodos
• public static Bson unionWith(String coll, List<? extends Bson>
pipeline): Devuelve un objeto Bson representando la etapa
$unionWith y pasando como parámetros el nombre de la
colección cuyos documentos se unirán con los de la
colección desde donde se llamó a aggregate o la etapa
anterior a la actual dentro de la misma llamada y la lista de
etapas a ejecutar sobre la unión resultante.
• Cada elemento en pipeline debe ser un objeto Bson creado
desde cualquier método de Aggregates, incluyendo este.
La clase Aggregates: métodos
• public static Bson unwind(String field): Devuelve un objeto Bson
representando la etapa $unwind y pasando como parámetro el nombre del
campo deseado en la colección o etapa anterior, anteponiéndole el caracter
peso.
• public static Bson unwind(String field, UnwindOptions opts): Igual al anterior,
pero aplicando opciones especificadas en opts.
• public static Bson out(String coll): Devuelve un objeto Bson representando la
etapa $out y pasando como parámetro el nombre de la colección donde
guardar los documentos obtenidos de la colección o etapa anterior.
• Si la colección ya existe en la base de datos, su contenido previo se
borrará al llamar a Aggregate.
La clase Aggregates: métodos
• public static Bson out(String db, String coll): Igual al anterior, pero
especificando la base de datos objetivo en vez de la actual.
• public static Bson out(Bson dest): Igual a out(coll) pero con el destino
siendo especificado en el contenido de dest.
• public static Bson merge(String coll): Devuelve un objeto Bson
representando la etapa $merge y pasando como parámetro la
colección donde se guardarán los documentos en la colección o etapa
anterior
• Si la colección ya existe en la base de datos, los documentos en la
colección o etapa anterior serán agregados al final del contenido
actual.
La clase Aggregates: métodos
• public static Bson merge(Namespace ns): Igual al anterior, pero
especificando la colección y base de datos objetivo en ns.
• public static Bson merge(String coll, MergeOptions opts): Igual
a merge(coll) pero aplicando opciones a la etapa.
• public static Bson merge(Namespace ns, MergeOptions opts):
Igual a merge(ns), pero aplicando opciones a la etapa.
• public static Bson replaceRoot(T val): Devuelve un objeto Bson
representando la etapa $replaceRoot y pasándole como
parámetro el nuevo valor raíz
La clase Aggregates: métodos
• public static Bson replaceWith(T val): Devuelve un objeto Bson
representando la etapa $replaceWith y pasándole como
parámetro el nuevo valor raíz.
• public static Bson sample(int size): Devuelve un objeto Bson
representando la etapa $sample y pasándole como parámetro
la cantidad de documentos a seleccionar aleatoriamente.
• public static Bson densify(String field, DensifyRange rng):
Devuelve un objeto Bson representando la etapa $densify y
especificando el campo a densificar y el rango de valores para
ello.
La clase Aggregates: métodos
• public static Bson densify(String field, DensifyRange rng,
DensifyOptions opts): Igual que el anterior, pero aplicando opciones al
densificado.
• public static Bson fill(FillOptions opts, FillOutputField output,
FillOutputField... moreOutput): Crea un objeto Bson representando la
etapa $fill y especificando opciones de rellenado y uno o más campos
de salida.
• Ningún parámetro puede ser nulo.
• public static Bson fill(FillOptions opts, Iterable<? extends
FillOutputField> output): Igual al anterior, pero con todos los campos
de salida especificados dentro de una instancia de la interfaz Iterable.
Las clases Field<T>, Variable<T> y
BsonField
• Ambas clases está ubicadas en el paquete [Link].
• La clase Field<T> permite hacer referencia a un campo para una etapa reconocida por aggregate que
requiera de uno o varios campos.
• La clase Variable<T> permite hacer referencia a una variable a ser declarada en la base de datos con el
operador $let.
• La clase BsonField es equivalente a Field<Bson>, pero no se considera extensión de esa clase.
BsonField es utilizada para representar un campo acumulador utilizado en el método group de aggregate
• Cada objeto Field<T>, Variable<T> y BsonField contiene un String con el nombre del campo o variable y
el valor o la expresión devolviendo un valor para el campo o variable.
• Para Field<T> y Variable<T>, el valor del campo o variable es una instancia de una clase T
cualquiera y puede ser nulo
• Para BsonField, el valor del campo debe ser una instancia de Bson representando una operación
• La única forma de setear estos miembros es al momento de crear el objeto con su correspondiente
constructor:
• public Field<T>(String nombre, T expr)
• public Variable<T>(String nombre, T expr)
• public BsonField(String nombre, Bson expr)
Las clases Field<T>, Variable<T> y
BsonField
• Una vez creado el objeto, se pueden obtener sus
miembros con los siguientes métodos getter:
• public String getName()
• public T getValue(), para Field<T> y Variable<T>
• public Bson getValue() para BsonField
• Además, las tres clases sobrescriben los métodos equals,
hashCode y toString de la clase Object.
La clase Facet
• Esta clase está ubicada en el paquete [Link] y permite
implementar un campo del objeto de entrada recibido por la etapa $facet, por lo que
debe ser agregado a la lista pasada como parámetro al método facet de Aggregates.
• Cada objeto Facet contiene un String con el nombre del campo o variable y una
lista de objetos Bson con las etapas.
• Cada objeto Bson en la lista de etapas debe haber sido creado por cualquier
método de Aggregate que no represente las etapas $out, $merge y $facet.
• La única forma de setear estos miembros es al momento de crear el objeto con uno
de los siguientes constructores
• public Facet(String name, List<? extends Bson> pipeline)
• public Facet(String name, Bson... pipeline)
La clase Facet
• Una vez creado el objeto, se pueden obtener sus
miembros con los siguientes métodos getter:
• public String getName()
• public List<? Extends Bson> getPipeline()
• Además, la clase sobrescribe los métodos equals,
hashCode y toString de la clase Object.
La clase UnwindOptions
• Esta clase está ubicada en el paquete [Link] y permite implementar
opciones a aplicar a una llamada al método [Link](field, options)
• La clase tiene un único constructor, el constructor por defecto
• Cada objeto UnwindOptions contiene un String con el campo donde guardar los índices de
arreglos y una bandera booleana para indicar si se debe preservar valores nulos y arreglos
vacíos.
• Ambos miembros pueden ser nulos
• Cada miembro de un objeto UnwindOptions se puede obtener con los siguientes métodos getter:
• public Boolean isPreserveNullAndEmptyArrays()
• public String getIncludeArrayIndex()
• Además, cada miembro puede setearse en cadena con los siguientes métodos:
• public UnwindOptions preserveNullAndEmptyArrays(Boolean pnea)
• public UnwindOptions includeArrayIndex(String iai)
• Además, la clase sobrescribe el método toString de la clase Object.
La clase MergeOptions
• Esta clase está ubicada en el paquete [Link] y permite implementar opciones a aplicar a una
llamada al método [Link](coll, options)
• La clase tiene un único constructor, el constructor por defecto
• Además, dentro de MergeOptions se definieron dos enumeraciones públicas:
• WhenMatched: esta enumeración proporciona constantes para indicar acciones a realizar cuando hay
documentos cuyo(s) campo(s) especificado(s) en el campo on coinciden tanto en la colección destino como en
la colección o etapa anterior desde aggregate (ver la diapositiva siguiente para más detalles):
• REPLACE: Reemplazar el documento existente
• KEEP_EXISTING: Conservar el documento existente
• MERGE: Fusionar ambos documentos
• PIPELINE: Pasar el documento existente por una lista de etapas (ver la diapositiva siguiente para más
detalles
• FAIL: Detener la operación e indicar error. Cualquier cambio previo no será deshecho
• WhenNotMatched: Esta enumeración proporciona acciones a realizar cuando no hay documentos coincidentes
entre la colección destino y la colección o etapa anterior en aggregate:
• INSERT: Insertar el nuevo documento
• DISCARD: Descartar el nuevo documento
• FAIL Detener la operación e indicar error. Cualquier cambio previo no será deshecho.
La clase MergeOptions
• Cada objeto UnwindOptions contiene:
• Una lista de Strings conteniendo “identificadores únicos”, es decir, los campos a
utilizar para determinar si hay documentos coincidentes, lo que corresponde al valor
del campo on en el objeto de entrada de la etapa $merge
• Una constante definida en la enumeración WhenMatched (ver la diapositiva anterior
para más detalles)
• Una constante definida en la enumeración WhenNotMatched
• Una lista de variables a ser declaradas con el operador $let
• Una lista de objetos Bson representando etapas a aplicar sobre los documentos
resultantes.
• Esta lista solo aplica cuando la constante WhenMatched utilizada es PIPELINE
• Cada objeto en la lista debe ser una instancia de Bson creada desde un método
de Aggregates representando una etapa apropiada.
La clase MergeOptions
• Cada miembro puede ser seteado en cadena con los siguientes
métodos:
• public MergeOptions uniqueIdentifier(String id) (para establecer un
único campo de comparación)
• public MergeOptions uniqueIdentifier(List<String> ids)
• public MergeOptions whenMatched([Link]
wm)
• public MergeOptions
whenNotMatched([Link] wnm)
• public MergeOptions variables(List<Variable<?>> vars)
• public MergeOptions whenMatchedPipeline(List<Bson> wmp)
La clase MergeOptions
• Cada miembro puede ser obtenido con los siguientes métodos
getter:
• public List<String> getUniqueIdentifier()
• public [Link] getWhenMatched()
• public [Link]
getWhenNotMatched()
• public List<Variable<?>> getVariables()
• public List<Bson> whenMatchedPipeline()
• Además, la clase sobrescribe los métodos equals, hashCode y
toString de Object
La interfaz DensifyRange
• Esta interfaz, perteneciente al paquete
[Link] permite implementar
rangos e incrementos para las llamadas a densify de
Aggregates.
• La interfaz es una extensión de la interfaz Bson, por lo que
hereda todos los métodos de ella.
• Se recomienda fuertemente no crear clases que implementen
la interfaz. En vez de eso, para obtener instancias de
DensifyRange, utilice los métodos estáticos propios de ésta.
La interfaz DensifyRange: métodos
• public static NumberDensifyRange fullRangeWithStep(Number
step): Crea un objeto DensifyRange para especificar el rango “full”
con el incremento especificado en step.
• NumberDensifyRange es una interfaz que es extensión de, y está
en el mismo paquete que DensifyRange. No tiene miembros
propios.
• El parámetro step no puede ser nulo.
• public static NumberDensifyRange partitionRangeWithStep(Number
step): Igual al anterior, pero con el rango “partition”.
La interfaz DensifyRange: métodos
• public static NumberDensifyRange rangeWithStep(Number min,
Number max, Number step): Crea un objeto DensifyRange para
especificar el rango comprendido entre min, inclusive y max, exclusive,
con el incremento especificado en step.
• Ningún parámetro puede ser nulo
• public static DateDensifyRange fullRangeWithStep(long step,
MongoTimeUnit mtu): Igual que fullRangeWithStep(step) pero para un
campo de tipo fecha.
• La interfaz DateDensifyRange tiene las mismas características que
NumberDensifyRange.
• El parámetro unit no puede ser nulo.
La interfaz DensifyRange: métodos
• public static DateDensifyRange partitionRangeWithStep(long step,
MongoTimeUnit mtu): Igual que partitionRangeWithStep(step) pero para un
campo de tipo fecha.
• public static DateDensifyRange rangeWithStep(Instant min, Instant max, long
step, MongoTimeUnit mtu): Igual que rangeWithStep(min, max, step) pero
para un campo de tipo fecha
• public static DensifyRange of(Bson rng): Crea un objeto DensifyRange
acerca de la representación BSON de un campo range para la etapa
$densify.
• El objeto rng debe ser cualquier objeto BSON devuelto por todos los
demás métodos de DensifyRange o uno que contenga los campos
bounds, step y unit con un valor apropiado para cada uno.
La enumeración MongoTimeUnit
• Esta enumeración, ubicada en el paquete [Link], permite definir
las siguientes constantes para unidades de tiempo reconocidas por MongoDB:
MILISECOND (milisegundo), SECOND (segundo), MINUTE (minute), HOUR (hora),
DAY (día), WEEK (semana), MONTH (mes), QUARTER (cuatrimestre) y YEAR (año)
• Cada constante está asociada a:
• Una representación String igual al nombre de la constante con todas las letras
minúsculas
• Una bandera booleana para indicar si la unidad de tiempo tiene una duración fija.
• Su valor es false para YEAR, QUARTER y MONTH y true para el resto
• Ambos miembros se pueden obtener con los siguientes métodos getter:
• public String value()
• public boolean fixed()
La interfaz DensifyOptions
• Esta interfaz, ubicada en el paquete [Link], debe ser implementada por
clases de las cuales se desee que sean instancias objetos que establezcan opciones de densificación
• No obstante, también proporciona dos métodos por defecto para crear objetos DensifyOptions:
• public default DensifyOptions partitionByFields(String... fields) crea un objeto DensifyOptions
especificando los campos que serán utilizados para generar las particiones.
• Se puede llamar a este método sin parámetros.
• public default DensifyOptions densifyOptions(): Crea un objeto DensifyOptions sin especificar
campos para particiones
• La interfaz proporciona dos métodos abstractos:
• public DensifyOptions partitionByFields(Iterable<String> fields): Especifica campos para
particiones a partir de una lista y crea el objeto resultante.
• public DensifyOptions option(String name, Object value): Crea un objeto a partir de una opción
específica (nombre, valor) en situaciones donde no existe un método builder que satisfaga las
necesidades del programador.
• El parámetro name debe ser cualquier campo admitido por la etapa $densify excepto field.
• El parámetro value debe tener un valor apropiado dependiendo del valor de name.
La interfaz FillOptions
• Esta interfaz, ubicada en el paquete [Link],
debe ser heredada por clases desde las cuales crear objetos que
permitan establecer opciones de rellenado a ser aplicadas al llamar al
método fill de Aggregates.
• No obstante, la interfaz proporciona métodos por defecto para crear
instancias de FillOptions sin necesidad de crear una clase que la
implemente:
• public default [Link](String... fields): Crea un
objeto FillOptions especificando campos para crear particiones.
• public default FillOptions fillOptions(): Crea un objeto FillOptions sin
especificar campos para generar particiones.
La interfaz FillOptions
• La interfaz proporciona los siguientes métodos abstractos:
• public FillOptions partitionBy(T expr): Crea un objeto FillOptions especificando la(s)
expresión(es) especificada(s) para generar particiones.
• public FillOptions partitionByFields(Iterable<String> fields): Igual al método por defecto
del mismo nombre, pero especificando campos en una instancia de cualquier clase que
implemente la interfaz Iterable.
• public FillOptions sortBy(Bson s): Crea un objeto FillOptions especificando ordenamiento
por uno o más campos
• El objeto s debe ser cualquier objeto devuelto por la llamada a cualquier método de la clase Sorts.
• public FillOptions option(String name, Object value): Crea un objeto a partir de una opción específica
(nombre, valor) en situaciones donde no existe un método builder que satisfaga las necesidades del
programador.
• El parámetro name debe ser cualquier campo admitido por la etapa fill.
• El parámetro value debe tener un valor apropiado dependiendo del valor de name.
La interfaz FillOutputField
• Esta interfaz, ubicada en el paquete [Link],
debe ser heredada por clases desde las cuales crear objetos que
permitan establecer opciones de rellenado a ser aplicadas al llamar
al método fill de Aggregates.
• La interfaz es una extensión de la interfaz Bson, por lo que hereda
todos sus métodos.
• No se recomienda crear una clase que implemente la
interfaz. En vez de eso, para crear un objeto FillOutputField,
se debe llamar a uno de sus propios métodos estáticos.
La interfaz FillOutputField: métodos
• public static ValueFillOutputField value(String field, T expr): Crea un objeto
FillOutputField a partir de la expresión especificada.
• ValueFillOutputField es una interfaz sin miembros propios que es una extensión de, y está en
el mismo paquete que FillOutputField.
• public static LocfFillOutputField locf(String field): Crea un objeto FillOutputField para
especificar rellenado por el campo local field.
• LocFillOutputField es una interfaz sin miembros propios que es una extensión de, y está en el
mismo paquete que FillOutputField.
• public static LinearFillOutputField linear(String field): Igual al anterior, pero
especificando relleno lineal.
• LinearFillOutputField es una interfaz sin miembros propios que es una extensión de, y está en el mismo paquete que FillOutputField.
• public static FillOutputField of(Bson f): Crea un objeto FillOutputField a partir de un
objeto Bson conteniendo los campos admitidos por el campo output en la etapa $fill
con sus valores correctos.
La clase Projections: métodos
• public static Bson computed(String field, T expr): Devuelve un
objeto Bson indicando que la salida de $project debe incluir el
campo field con valor igual al calculado por expr.
• public static Bson include(String... fields): Devuelve un objeto
Bson indicando que la salida de $project debe incluir todos
los campos especificados en fields con sus respectivos
valores.
• public static Bson include(List<String> fields): Igual que el
anterior, pero con los campos especificados en una lista.
La clase Projections: métodos
• public static Bson exclude(String... fields): Devuelve un objeto Bson
indicando que la salida de $project debe excluir todos los campos
especificados en fields con sus respectivos valores.
• public static Bson exclude(List<String> fields): Igual que el anterior,
pero con los campos especificados en una lista.
• public static Bson excludeId(): Devuelve un objeto Bson indicando
que la salida de $project debe excluir el campo _id.
• public static Bson elemMatch(String field): Devuelve un objeto Bson
indicando que la salida de $project debe incluir el campo field, con
valor igual al primer elemento de éste.
• El parámetro field debe corresponder a un campo de tipo arreglo.
La clase Projections: métodos
• public static Bson elemMatch(String field, Bson filter): Devuelve un
objeto Bson indicando que la salida de $project debe incluir el
campo field, con valor igual al primer elemento de éste, pero solo
para los documentos que cumplen con lo especificado en filter.
• El parámetro field debe corresponder a un campo de tipo arreglo.
• El parámetro filter debe ser un objeto Bson devuelto por cualquier método
de la clase Filters.
• public static Bson slice(String field, int limit): Devuelve un objeto
Bson para indicar que en la salida de $project debe incluir el campo
field con valor igual a los primeros limit elementos de éste.
• El parámetro filter debe corresponder a un campo de tipo arreglo.
La clase Projections: métodos
• public static Bson slice(String field, int skip, int limit): Igual
al anterior, pero incluyendo los limit documentos del
arreglo a partir del índice skip.
• public static Bson fields(Bson... p): Combina todos los
objetos Bson en p y devuelve el resultado.
• Todos los objetos en p deben haber sido devueltos por una
llamada a cualquier método de Projections, incluyendo éste.
• public static Bson fields(List<? extends Bson> p): Igual al
anterior, pero con objetos Bson guardados en una lista.
La clase Sorts: métodos
• public static Bson ascending(String... fields): Devuelve un objeto Bson para indicar que el
resultado debe ser ordenado ascendentemente por todos los campos especificados en fields.
• public static Bson ascending(List<String> fields): Igual al anterior, pero con los campos
especificados desde una lista.
• public static Bson descending(String... fields): Devuelve un objeto Bson para indicar que el
resultado debe ser ordenado descendentemente por todos los campos especificados en fields.
• public static Bson descending(List<String> fields): Igual al anterior, pero con los campos
especificados desde una lista.
• public static Bson orderBy(Bson... s): Combina todos los objetos Bson en s y devuelve el objeto
resultante
• Cada objeto en s debe haber sido devuelto por cualquier método de Sorts, incluyendo este.
• public static Bson orderBy(List<? extends Bson> s): Igual al anterior, pero con objetos Bson
provenientes de una lista.
La clase Accumulators: métodos
• public static BsonField sum(String field, T expr): Crea un
objeto BsonField representando el acumulador $sum
pasando el campo y la expresión especificada.
• public static BsonField avg(String field, T expr): Crea un
objeto BsonField representando el acumulador $avg
pasando el campo y la expresión especificada.
• public static BsonField first(String field, T expr): Crea un
objeto BsonField representando el acumulador $avg
pasando el campo y la expresión especificada.
La clase Accumulators: métodos
• public static BsonField firstN(String field, I inExpr, N nExpr): Crea un objeto BsonField
representando el acumulador $firstN pasando el campo, la expresión para indicar el
input y la expresión para indicar la cantidad máxima de documentos a obtener.
• public static BsonField top(String field, Bson sort, T outExpr): Crea un objeto BsonField
representando el acumulador $top pasando el campo, el criterio de ordenamiento y la
expresión para la salida
• El parámetro sort debe ser un objeto devuelto por una llamada a cualquier método de la clase
Sorts.
• public static BsonField topN(String field, Bson sort, O outExpr, N nExpr): Crea un objeto
BsonField representando el acumulador $topN pasando el campo, el criterio de
ordenamiento, la expresión para la salida y la expresión para la cantidad máxima de
documentos a obtener.
• El parámetro sort debe ser un objeto devuelto por una llamada a cualquier método de la clase
Sorts.
La clase Accumulators: métodos
• public static BsonField last(String field, T expr): Crea un objeto BsonField representando el acumulador
$last pasando el campo y la expresión especificada.
• public static BsonField lastN(String field, I inExpr, N nExpr): Crea un objeto BsonField representando el
acumulador $lastN pasando el campo, la expresión para indicar el input y la expresión para indicar la
cantidad máxima de documentos a obtener.
• public static BsonField bottom(String field, Bson sort, T outExpr): Crea un objeto BsonField
representando el acumulador $bottom pasando el campo, el criterio de ordenamiento y la expresión
para la salida
• El parámetro sort debe ser un objeto devuelto por una llamada a cualquier método de la clase
Sorts.
• public static BsonField bottomN(String field, Bson sort, O outExpr, N nExpr): Crea un objeto BsonField
representando el acumulador $bottomN pasando el campo, el criterio de ordenamiento, la expresión
para la salida y la expresión para la cantidad máxima de documentos a obtener.
• El parámetro sort debe ser un objeto devuelto por una llamada a cualquier método de la clase
Sorts.
La clase Accumulators: métodos
• public static BsonField max(String field, T expr): Crea un objeto BsonField
representando el acumulador $max pasando el campo y la expresión especificada.
• public static BsonField maxN(String field, I inExpr, N nExpr): Crea un objeto
BsonField representando el acumulador $maxN pasando el campo, la expresión
para indicar el input y la expresión para indicar la cantidad máxima de documentos
a obtener.
• public static BsonField min(String field, T expr): Crea un objeto BsonField
representando el acumulador $min pasando el campo y la expresión especificada.
• public static BsonField minN(String field, I inExpr, N nExpr): Crea un objeto
BsonField representando el acumulador $minN pasando el campo, la expresión
para indicar el input y la expresión para indicar la cantidad máxima de documentos
a obtener.
La clase Accumulators: métodos
• public static BsonField push(String field, T expr): Crea un objeto
BsonField representando el acumulador $push pasando el
campo y la expresión especificada.
• public static BsonField addToSet(String field, T expr): Crea un
objeto BsonField representando el acumulador $addToSet
pasando el campo y la expresión especificada.
• public static BsonField mergeObjects(String field, T expr): Crea
un objeto BsonField representando el acumulador
$mergeObjects pasando el campo y la expresión especificada.
La clase Accumulators: métodos
• public static BsonField stdDevPop(String field, T expr):
Crea un objeto BsonField representando el acumulador
$stdDevPop pasando el campo y la expresión
especificada.
• public static BsonField stdDevAmp(String field, T expr):
Crea un objeto BsonField representando el acumulador
$stdDevAmp pasando el campo y la expresión
especificada.
La clase Accumulators: métodos
• public static BsonField accumulator(String field, String init, String accumulate, String
merge): Crea un objeto BsonField representando el acumulador $accumulator pasando
el campo, la función para el estado inicial, la función de acumulado y la función de
unión de estados, pero sin especificar parámetros para las funciones de inicio ni de
acumulado y sin incluir una función de finalización.
• public static BsonField accumulator(String field, String init, String accumulate, String
merge, String finalize): Igual que el anterior, pero especificando además una función de
finalización.
• El argumento finalize puede ser nulo
• public static BsonField accumulator(String field, String init, List<String> initArgs, String
accumulate, List<String> accumulateArgs, String merge, String finalize): Igual al anterior,
pero especificando además argumentos para las funciones de inicio y acumulado.
• Los argumentos finalize, initArgs y accumulateArgs pueden ser nulos.
Transacciones
¿Qué es y cómo se hace una transacción
en MongoDB?
• Una transacción es un grupo lógico de procesamiento en una base de datos que encapsula una
o más operaciones de cualquier tipo a través de múltiples documentos.
• Con esto, el programador se asegura de que, para N operaciones dentro de una transacción, si
una de ellas falla debido a una excepción, todas fallarán
• En teoría, para crear y ejecutar una transacción en MongoDB, se deben seguir los siguientes
pasos:
 Obtener un objeto MongoClient conectándose al servidor con el método
[Link] (cualquier sobrecarga sirve)
 Obtener un objeto ClientSession a partir del objeto MongoClient obtenido llamando al
método createSession()
 Crear uno o más objetos que son instancias de la interfaz TransactionBody y sobrescribir el
método execute de esa interfaz para que cada objeto realice la(s) operación(es) deseadas.
 Una vez creado(s) el(los) objeto(s), llamar, por cada uno, al método withTransaction del
objeto ClientSession obtenido pasándole como parámetro el objeto TransactionBody creado.
La interfaz TransactionBody<T>
• Esta interfaz, ubicada en la interfaz [Link], debe
ser implementada por cualquier clase que se desee utilizar para
generar el cuerpo de una transacción.
• La interfaz tiene un único método llamado public T execute()
para la ejecución de la transacción.
• Por el hecho de tener un único método abstracto y no extender
de otras interfaces que tienen al menos uno, TransactionBody
se considera una interfaz funcional, por lo que se puede usar
una expresión lambda para crear una instancia de ésta.
La interfaz ClientSession
• Esta interfaz, ubicada en el paquete [Link], debe ser
implementada por cualquier clase que se desee utilizar para generar un
cliente de sesión que soporte transacciones.
• El driver de MongoDB proporciona clases que implementan esta interfaz.
Dichas clases son insignificantes para este documento.
• Para obtener un objeto ClientSession, se debe llamar al método
startSession() de la interfaz MongoClient.
• La interfaz es una extensión indirecta de la interfaz Closeable, por lo que:
• Hereda el método public void close()
• Instancias de la interfaz pueden ser declaradas y usadas dentro de un
try con recursos.
La interfaz ClientSession: métodos
fundamentales
• public boolean hasActiveTransaction(): Devuelve true si
existe una transacción activa siendo ejecutada desde la
sesión.
• public TransactionOptions getTransactionOptions(): Obtiene
las opciones establecidas sobre una transacción.
 Esa transacción debe estar activa al momento de llamar al
método.
• public void startTransaction(): Inicia una transacción a menos
que haya otra actualmente activa.
La interfaz ClientSession: métodos
fundamentales
• public void commitTransaction(): Guarda los cambios
realizados desde una transacción. La transacción debe haber
sido iniciada antes de llamar al método.
• public void abortTransaction(): Aborta una transacción. La
transacción debe haber sido iniciada antes de llamar al método.
• public T withTransaction(TransactionBody<T> body): Ejecuta el
cuerpo de la transacción.
 NOTA: llamar a este método inicia la transacción
automáticamente.
Ejemplos de desarrollo en JAVA con
el driver de MongoDB
Ejemplo 1.1
• Crear una aplicación que se conecte a una base de datos
MongoDB con una URL de conexión recibida desde línea
de comandos con la opción –D [Link]=<URL> del
comando java
– Cualquier valor para una propiedad (clave=valor) especificada
en línea de comandos con la opción –D del comando java se
puede obtener en la aplicación con la llamada al método
[Link](clave)
Ejemplo 1.2
• Una vez establecida la conexión:
– Guardar la lista de todas las bases de datos existentes en el
servidor especificado en la URL en una lista de documentos.
• Usar la clase Document para crear/obtener documentos
• Ignorar cualquier advertencia por variable declarada y no usada.
– Especificar que se utilizará la base de datos “sample_training”
Ejemplo 1.3
• Una vez establecida la conexión (cont.):
– Insertar en una colección de dicha base de datos llamada “inspections” un
documento con los siguientes campos:
• _id: Un objeto ObjectId nuevo.
• id: “10021-2015-ENFO”
• certificate_number: 9278806 (guardar como número)
• business_name: “ATLIXCO DELI GROCERY INC.”
• date: Un objeto [Link] haciendo referencia al 20 de febrero del 2015
• result: “No Violation Issued”
• sector: “Cigarrette Retail Dealer - 127”
• address: Un documento embebido que tenga los siguientes campos:
– city: “RIDGEWOOD”
– zip:11305 (guardar como número)
– street: “MENAHAN ST”
– number: 1712 (guardar como número)
– Una vez insertado el documento, imprimer en pantalla el _id del documento
insertado
Solución ejemplo 1
Ejemplo 2
• Desarrollar una aplicación que se conecte al mismo servidor y del mismo modo que en
el ejemplo 1
• Indicar que se trabajará con la base de datos “bank” y con la colección “accounts” en
esa base de datos.
• Insertar dos documentos:
– El primer documento debe contener la siguiente información:
• “account_holder”: “john_doe”
• “account_id”: “MDB99115881”
• “balance”: 1785
• “account_type”: “checking”
– El segundo documento debe contener la siguiente información:
• “account_holder”: “jane doe”
• “account_id”: “MDB79101843”
• “balance”: 1468
• “account_type”: “checking”
• Mostrar en pantalla el _id de cada documento insertado
Solución ejemplo 2
Ejemplo 3
• Desarrollar una aplicación que se conecte al mismo
servidor y del mismo modo que en el ejemplo 1 y que
trabaje con la misma base de datos y colección que el
ejemplo 2.
• Una vez establecida la conexión, mostrar en pantalla
todos los documentos en la colección con un balance
mayor o igual que 1000 y un “account_type” igual a
“checking”
– Mostrar cada resultado en formato JSON.
Solución ejemplo 3
Ejemplo 4
• Repetir el ejemplo anterior, pero usando un cursor para recorrer los resultados
Ejemplo 5
• Repetir el ejemplo 3, pero mostrando solo el primer resultado encontrado
Ejemplo 6
• Desarrollar una aplicación que se conecte al mismo
servidor y del mismo modo que en el ejemplo 1 y que
trabaje con la misma base de datos y colección que el
ejemplo 2.
• Una vez establecida la conexión, actualizar el documento
de esa colección que tenga un account_id igual a
MDB12234728 asignándole el valor “active” a
account_status e incrementar en 100 el balance.
Solución ejemplo 6
Ejemplo 7
• Desarrollar una aplicación que se conecte al mismo
servidor y del mismo modo que en el ejemplo 1 y que
trabaje con la misma base de datos y colección que el
ejemplo 2.
• Una vez establecida la conexión, actualizar todos los
documentos de esa colección que tengan un
account_type igual a “savings” asignándole el valor 100 a
su minimum_balance.
Solución ejemplo 7
Ejemplo 8
• Desarrollar una aplicación que se conecte al mismo
servidor y del mismo modo que en el ejemplo 1 y que
trabaje con la misma base de datos y colección que el
ejemplo 2.
• Una vez establecida la conexión, eliminar un único
documento de esa colección que tenga un
account_holder igual a “john doe”.
Solución ejemplo 8
Ejemplo 9
• Desarrollar una aplicación que se conecte al mismo
servidor y del mismo modo que en el ejemplo 1 y que
trabaje con la misma base de datos y colección que el
ejemplo 2.
• Una vez establecida la conexión, eliminar todos los
documentos de esa colección que tengan un
account_status igual a “dormant”.
Solución ejemplo 9
Ejemplo 10
• Desarrollar una aplicación que se conecte al mismo servidor y del
mismo modo que en el ejemplo 1 y que trabaje con la misma base de
datos y colección que el ejemplo 2.
• Una vez establecida la conexión, realizar las siguientes
actualizaciones:
• Al documento con account_id “MDB310054629” disminuir su
balance en 200
• Al documento con account_id “MDB643731035” incrementar su
balance en 200
• Usar una transacción desde el momento en que se indique que se
usará la base de datos.
Solución ejemplo 10
Ejemplo 11
• Desarrollar una aplicación que se conecte al mismo servidor y del
mismo modo que en el ejemplo 1 y que trabaje con la misma base de
datos y colección que el ejemplo 2.
• Una vez establecida la conexión, usar el método aggregate para
mostrar en pantalla la información completa del documento con
account_id MDB310054629
Solución ejemplo 11
Ejemplo 12
• Repetir el ejemplo anterior, pero esta vez mostrando la suma y el
promedio del campo balance en los respectivos campos “total_balance”
y “account_type”, agrupados por el valor de account_type.
Ejemplo 13
• Desarrollar una aplicación que se conecte al mismo servidor y del
mismo modo que en el ejemplo 1 y que trabaje con la misma base de
datos y colección que el ejemplo 2.
• Una vez establecida la conexión, usar el método aggregate para
ejecutar 3 etapas:
• En la primera, filtrar los documentos de la colección obteniendo solo aquellos
con balance mayor que 1500 y un account_type igual a checking.
• En la segunda, ordenar los resultados de la etapa anterior descendentemente
por el balance
• En la tercera, para cada documento obtenido de la etapa anterior:
• Excluir el campo _id
• Incluir los campos account_id, account_type y balance
• Incluir un nuevo campo llamado euro_balance igual al cuociente entre el balance y 1.2
Solución ejemplo 13

También podría gustarte