MongoDB: Updates complejos - array

MongoDB: Updates complejos - array

En el artículo anterior, expliqué qué era MongoDB y los comandos básicos para insertar, eliminar y actualizar datos.

Hoy aprenderemos cómo insertar y cambiar elementos en una matriz usando los operadores de actualización en MongoDB.

Según la documentación de MongoDB, existen cuatro de estos modificadores, que se tratarán en el artículo.


¿Pero por qué eso es importante?


Considerando que los arrays son estructuras de datos muy importantes en el contexto del modelado de MongoDB y que MongoDB es una base de datos no relacional, también tenemos que recordar que es imposible que no haya ningún tipo de relación entre sus datos. Así, los arrays son estructuras que se encargan de esta necesaria relación entre datos.

Con ellos podemos crear estructuras que simulan algo así como la relación 1:N <- uno a muchos como en la base de datos relacional, y MongoDB ofrece una estructura que hace mucho más fácil el uso de estas estructuras.

Recordando que estos operadores, además de estar restringidos a datos de array, también se utilizarán únicamente en operaciones de actualización.

¿Cuáles son?

Como se dijo anteriormente, según la documentación oficial, existen 4 modificadores: $each, $position, $Slice y $sort.

Sintaxis:

A pesar de ser muy similares, cada uno de los Update Operators tiene peculiaridades que se explicarán una a una a continuación.

$each

  • Función: Nos permite insertar múltiples valores en un campo tipo array. Solo funcionará con operadores $push y $addToSet.
  • Sintaxis: Se declarará después del campo que se modificará y también recibe un array con los valores a insertar.

De ahora en adelante, usaré una lista de compras en los ejemplos justo después de la sintaxis para una mejor comprensión.

$position

  • Función: Permite insertar uno o más archivos en una posición específica del array. Sólo funcionará con el operador $push.
  • Sintaxis: Siempre será necesario usar $each previamente, luego declararemos $position e informaremos desde qué posición se insertarán los nuevos valores.


$slice

  • Función: Limita la inserción de nuevos valores. Solo funcionará con el operador $push.
  • Sintaxis: Siempre será necesario usar $each previamente, luego declararemos $slice y definiremos el número máximo de valores que se insertarán.


$sort

  • Función: Organiza todos los valores contenidos en el array de manera ordenada, y también organiza aquellos que se agregarán. Sólo funcionará con el operador $push.
  • Sintaxis: Siempre será necesario usar $each previamente, luego declararemos $sort y definiremos por qué campo se realizará la ordenación y si será ascendente o descendente.


Operadores:

Ahora profundizaremos un poco más en los operadores que se han utilizado pero aún no se han comentado, empezando por:

$push

¿Qué es?

$push es un operador que trata directamente con los datos del array, lo que permite agregar nuevos valores sin la necesidad de recrear un campo desde cero.

Sintaxis:

Hay dos formas de utilizar el operador $push. Podemos agregar uno o varios elementos a la vez en un solo array, además de contar con controles de comportamiento como la clasificación automática.

Para el primer ejemplo, invocamos $push, declaramos cuál de los campos recibirá la adición y finalmente definimos qué elemento se agregará.

En el otro caso, es obligatorio utilizar el operador $each, que además de permitirnos insertar múltiples valores, también abre la posibilidad de cambiar otros comportamientos.

$pop

¿Qué es?

Es un operador para eliminar elementos de un array, pudiendo ser el primer o el último elemento.

Sintaxis:

Para eliminar el primer o último elemento de un array invocamos al método $pop, luego definiremos el campo que contiene el array en el que se producirá el borrado y finalmente informamos qué elemento se eliminará, ya sea el primero o el último.


$pull

¿Qué es?

Al igual que $pop, $pull es un operador de eliminación de elementos, pero $pull es más "refinado" ya que nos permite eliminar elementos de un campo específico mediante condiciones, por lo que se eliminarán todos los elementos que coincidan con las condiciones impuestas en $pull.

Sintaxis:

Primero invocamos $pull, luego definimos cuál de los campos se eliminará y finalmente decimos qué condiciones deben cumplirse para que se elimine el elemento indicado.

$addToSet

¿Qué es?

Es un operador que funciona de manera similar a $push, pero $addToSet además de agregar nuevos valores a un campo tipo array, también realiza una verificación para evitar valores duplicados, por lo tanto, el valor a insertar será sólo será si es único.

También es bueno recordar que este proceso de validación de documentos duplicados es más “sensible” a errores, esto sucede porque $addToSet solo considerará valores que sean exactamente iguales.

Sintaxis:

Así como su comportamiento es similar al del operador $push, su sintaxis también es sumamente similar, lo que significa que también podemos agregar uno o más elementos a la vez usando $each, pero con $addToSet no es posible. Usamos otras opciones como $sort.

Si queremos agregar un elemento, debemos invocar el operador $addToSet, seguido del campo que recibirá la adición y luego definir el valor a agregar.

Si la intención es agregar varios elementos, necesitaremos invocar $addToSet, seguido del campo que recibirá la adición, luego declaramos el operador $each y finalmente definimos los valores que se agregarán.

💡
Nota: Si hay valores duplicados dentro del array en el que agregamos los elementos, MongoDB normalmente realizará la acción sin generar ningún error, pero no se agregará el valor duplicado, solo se mantendrá el valor preexistente en el array.


Filtros en arrays

¿Qué es?

Los filtros son diferentes formas en las que podemos seleccionar un valor en el array de forma dinámica. Si hiciéramos un paralelo con JS sería igual que el High Order Function (HOF) find().

Sintaxis:

Los filtros tienen una sintaxis simple, pero con su particularidad, porque funciona de manera similar a la interpolación de Node con mysql2.

Usaremos filtros de matriz dentro de las operaciones de actualización, usando el operador $[<identifier>] Definiremos un nombre genérico que será utilizado como referencia para la interpolación. En este punto, definiremos el valor que se buscará, usaremos la opción filtroArrays pasando las referencias que creamos antes y asignaremos un valor.


Junto con el filtro, usaremos la opción para actualizar todos los elementos que coincidan con la condición del filtroArrays o también solo para consulta, si estas son las condiciones del filtroArrays.

Quedaría así:

💡
Nota: Recuerda que <identifier> siempre debe comenzar con una letra minúscula y contener sólo caracteres alfanuméricos.

Citaré algunos ejemplos para una mejor aclaración. Aquí crearemos una colección de compras:


Para actualizar todos los elementos mayores o iguales a 100.00 en el price, usaremos el operador de posición filtrado $[<identifier>] con arrayFiltros.


El operador de posición $[<identifier>] actuará como un marcador de posición para todos los elementos del campo seleccionado que coincidan con las condiciones especificadas en el arrayFiltros.

Después de la operación, la colección compras tendrá el siguiente retorno como consecuencia de la operación:


$pullAll

¿Qué es?

$pullAll eliminará todas las instancias de valores especificados en el array existente. A diferencia de $pull, que elimina elementos especificando una consulta, $pullAll elimina todos los elementos que coinciden con los valores enumerados.

Sintaxis:


Siempre que necesites especificar un <field> en cualquier documento, utilice notación de puntos.

Comportamiento:

Si el <value> es un documento o un array, $pullAll sólo eliminará los elementos en el array que corresponden al <value> exactamente igual al especificado, incluyendo el orden.

A partir de la versión de MongoDB 5.0, el mongod ya no genera errores cuando usa un operador de actualización como $pullAll con una expresión de operación vacía ( { } ). Una actualización vacía significa que no se crearon cambios ni entradas, lo que significará que la operación no está operativa.

Ve el ejemplo abajo:

Crearemos la colección de números que tendrá un array aleatorio con números aleatorios.


En nuestra siguiente operación, eliminaremos todas las instancias que tengan el valor "0" y "2" del arrayNumeros.


Después de la actualización, arrayNumeros ya no tendrá las apariciones de los números “0” o “2”, quedando como sigue:


Y por último, pero no menos importante, tenemos el operador $[] que indica que el operador de actualización debe modificar todos los elementos en el campo del array especificado.

El operador $[] quedará así:


Úselo en operaciones de actualización como updateOne() y findAndModity() para modicar todos los elementos del array para el o los documentos que correspondan a la condición de la consulta. Por ejemplo:

Crearemos una colección students:


Para aumentar todos los elementos de las grades a 10, haciéndolo también para todos los documentos de la selección, procederemos así:


$[] incrementará todos los grades do array, haciendo que todos los elementos se incrementen en +10, con el siguiente aspecto:


Pronto brindaré formas más detalladas de usar MongoDB de la manera más eficiente posible.

¡Hasta luego!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.






Na nossa próxima operação, iremos remover todas as instâncias que tiverem o valor “0” e “2” do arrayNumeros.


Após a atualização, arrayNumeros não irá mais possuir as ocorrências dos números “0” ou “2”, ficando da seguinte forma


E por último, mas não menos importante, temos o operador $[] que indica que o operador de atualização deve modificar todos os elementos no campo do array especificado.

O operador $[] ficará da seguinte forma:


Use-o em operações de atualização como por exemplo o updateOne() e o findAndModity(), para modicar todos os elementos do array para o documento ou documentos que correspondam a condição da consulta. Por exemplo:

Criaremos uma coleção students:


Para podermos incrementar todos os elementos da “grades” para 10, também fazendo isso para todos os documentos da seleção, faremos da seguinte forma:


O $[] irá incrementar todos os “grades” do array, fazendo com que todos os elementos sejam incrementados com +10, ficando da seguinte forma:


Em breve, trarei formas mais aprofundadas para utilizarmos o MongoDB da forma mais eficiente possível.