Cuando un documento en MongoDB contiene un array, los operadores habituales como $set no son la herramienta adecuada para agregar o quitar elementos individuales dentro de esa lista. Para eso existen operadores específicos que permiten manipular arrays de forma precisa y eficiente, y aquí se explican con ejemplos prácticos sobre una colección de inventario.
¿Cómo preparar los datos de inventario para practicar?
Antes de manipular arrays, es necesario contar con documentos que los contengan. Se trabaja con una colección llamada inventory dentro de la base de datos platziStore. Cada documento incluye:
Un ID controlado manualmente.
Un objeto item con nombre, código y descripción.
Un campo quantity.
Un array de strings llamado tags (por ejemplo: ["electronics", "school", "book"]).
El dataset se carga ejecutando un script que primero vacía la colección y luego inserta los documentos con insertMany. Es importante ejecutar el dataset antes de cualquier operación [00:50], ya que sin datos la consulta no encontrará coincidencias y el campo modifiedCount será cero.
¿Cómo agregar un elemento a un array con push?
El operador $push agrega un elemento al final de un array dentro de un documento [02:15]. Solo funciona sobre campos de tipo array.
$push recibe el nombre del array (tags) y el valor a insertar ("headphone").
Tras ejecutar la operación, el resultado de matchedCount: 1 y modifiedCount: 1 confirma que el documento fue encontrado y actualizado.
Al correr un find, el arraytags del documento cuatro muestra el nuevo valor al final de la lista [03:40].
¿Cómo quitar elementos de un array con pull e in?
El operador $pull hace lo contrario: remueve elementos que coincidan con un valor dentro de un array [04:10]. También es exclusivo para campos de tipo array; si necesitas eliminar un atributo completo de un documento, usarías $unset.
¿Cómo eliminar un solo valor en todos los documentos?
Para quitar el string"book" de todos los documentos se utiliza updateMany con un filtro vacío {}, lo que significa que no hay condición de búsqueda y la operación aplica sobre toda la colección [05:00].
El resultado muestra matchedCount: 5 pero modifiedCount: 3 [05:35]. Esto no es un error: simplemente dos documentos no contenían "book" en su array, así que no hubo nada que modificar en ellos.
¿Cómo eliminar varios valores a la vez con in?
Si necesitas remover más de un elemento, no hace falta ejecutar la operación múltiples veces. Se combina $pull con el operador $in, que permite especificar una lista de valores a buscar y eliminar en una sola instrucción [06:55].
$in recibe un array con los valores que se desean remover.
El resultado indica matchedCount: 5 y modifiedCount: 5, porque todos los documentos tenían al menos uno de esos valores [08:10].
Tras la ejecución, varios documentos quedan con un tags vacío ([]), lo cual confirma que la combinación de ambos operadores funcionó correctamente.
¿Cuándo usar cada operador?
$push: agrega un elemento al final de un array.
$pull: remueve todos los elementos que coincidan con un valor o condición.
$in: realiza una búsqueda interna contra múltiples valores y se combina con $pull para eliminar varios elementos en una sola operación.
Estos tres operadores son fundamentales para mantener la integridad de los arrays dentro de los documentos sin necesidad de reescribir el documento completo. ¿Ya los probaste en tu propia colección? Comparte tu experiencia en los comentarios.
$each
Agrega múltiples valores al campo de la matriz.
$slice
Limita el número de elementos de la matriz. Requiere el uso del modificador $each.
$sort
Ordena los elementos de la matriz. Requiere el uso del modificador $each.
$position
Especifica la ubicación en la matriz en la que insertar los nuevos elementos. Requiere el uso del modificador $each. Sin el modificador $position, el $push agrega los elementos al final de la matriz
Mas sobre Array Update operators
Con los siguientes operadores podremos modificar los documentos que dentro contengan un array:
$push: Agrega un elemento en el array.
$pull: Remueve todos los elementos del array que hagan match con un query especifico.
$in: Hace match con algunos de los valores especificados en un arreglo.
Valla, este profesor es muy pro, se le entiende muy bien, eso si prestar atencion con enfoque
tiene otros cursos también de muy buena calidad
Está muy interesante el curso, al punto que me tiene trasnochando 😅
EL update many sin un query es como un SET sin un WHERE ? hay que ser cuidadosos con esto jeje
Según yo si
Array Update Operator
{_id:1,item:{name:"item ab",code:"123",description:"Single line description."},qty:15,tags:["school","book","bag","headphone","appliance"],},{_id:2,item:{name:"item cd",code:"123",description:"First line\nSecond line"},qty:20,tags:["appliance","school","book"]},{_id:3,item:{name:"item ij",code:"456",description:"Many spaces before line"},qty:25,tags:["school","book"]},{_id:4,item:{name:"item xy",code:"456",description:"Multiple\nline description"},qty:30,tags:["electronics","school"]},{_id:5,item:{name:"item mn",code:"000"},qty:20,tags:["appliance","school"]},
si queremos añadir un nuevo elemento a la propiedad de arreglo podemos hacerlo con el operador $push
$push: añade un elemento a un arreglo
$each: añade varios elementos a un arreglo
$pull: remueve un elemento de un arreglo
$in: remueve varios elementos de un arreglo
use("platzi_store")db.inventory.drop()db.inventory.insertMany([{_id:1,item:{name:"item ab",code:"123",description:"Single line description."},qty:15,tags:["school","book","bag","headphone","appliance"],},{_id:2,item:{name:"item cd",code:"123",description:"First line\nSecond line"},qty:20,tags:["appliance","school","book"]},{_id:3,item:{name:"item ij",code:"456",description:"Many spaces before line"},qty:25,tags:["school","book"]},{_id:4,item:{name:"item xy",code:"456",description:"Multiple\nline description"},qty:30,tags:["electronics","school"]},{_id:5,item:{name:"item mn",code:"000"},qty:20,tags:["appliance","school"]},])db.inventory.find()```use("platzi\_store")db.inventory.drop()db.inventory.insertMany(\[ { \_id:1,item:{name:"item ab",code:"123",description:"Single line description."},qty:15,tags: \["school","book","bag","headphone","appliance"],}, { \_id:2,item:{name:"item cd",code:"123",description:"First line\nSecond line"},qty:20,tags: \["appliance","school","book"]}, { \_id:3,item:{name:"item ij",code:"456",description:"Many spaces before line"},qty:25,tags: \["school","book"]}, { \_id:4,item:{name:"item xy",code:"456",description:"Multiple\nline description"},qty:30,tags: \["electronics","school"]}, { \_id:5,item:{name:"item mn",code:"000"},qty:20,tags: \["appliance","school"]},])db.inventory.find()
Otra forma de hacerlo:
db.inventory.updateMany({},{//delete this elements in a array$pullAll:{tags:["notebook","pencil"],},});
El codigo para quien lo necesite copiar de forma rapida:
use("platzi_store")db.inventory.drop()db.inventory.insertMany([{_id:1,item:{name:"item ab",code:"123",description:"Single line description."},qty:15,tags:["school","book","bag","headphone","appliance"],},{_id:2,item:{name:"item cd",code:"123",description:"First line\nSecond line"},qty:20,tags:["appliance","school","book"]},{_id:3,item:{name:"item ij",code:"456",description:"Many spaces before line"},qty:25,tags:["school","book"]},{_id:4,item:{name:"item xy",code:"456",description:"Multiple\nline description"},qty:30,tags:["electronics","school"]},{_id:5,item:{name:"item mn",code:"000"},qty:20,tags:["appliance","school"]},])db.inventory.find()
Hola Chicos \n Yo me quise seguir con el escenario anterior en Docker sobre una IT Stores de Dispositivos technicos como : Laptops , HeadPhones, Switches y Routers, por tanto me he creado un array de tiendas disponibles en mi Ciudad Captial para poder ejecrcer esta clase desde local en mi mongodb docker container , no desde Atlas conectado mas si conectado al contenedor que ya he levantado y No quiero tumbar ps asi practivo algode Docker tambien en mi OS. ahora mis Elementos Documentos quedan asi :
{"_id":ObjectId("6747a6105e57721f18a1474f"),"ProductName":"Airpods","Price":425,"Quantity":35,"BogStores":["PepeSierra","Calle127","CityCenter","ElDoradoMall","Kra30","SubaStation","PortalAmericas","Calle54","ChapineroPlazaq"]}```{"\_id":ObjectId("6747a6105e57721f18a1474f"),"ProductName":"Airpods","Price":425,"Quantity":35,"BogStores": \["PepeSierra","Calle127","CityCenter","ElDoradoMall","Kra30","SubaStation","PortalAmericas","Calle54","ChapineroPlazaq"]}\nLuego Ya pude hacer actualizaciones con $push && $pull y fue Genial. \nChatGTP me ayudo un poco tambien . 
Asi quedo mi Documento luego de push dos direcciones mas por la Ciudad .