¿Cómo realizar consultas efectivas en documentos con Arrays en MongoDB?
En el mundo del desarrollo de bases de datos, la manipulación y consulta de datos complejos es esencial para crear aplicaciones robustas. Una parte crucial de esto es saber cómo realizar consultas en documentos de MongoDB que contienen Arrays. Hoy te llevaremos a través de un recorrido sobre los operadores que puedes usar para trabajar con este tipo de estructuras y explotar todo su potencial.
¿Qué son los operadores in y nin?
Los operadores in y nin son fundamentales cuando trabajamos con Arrays en MongoDB, permitiendo consultas eficientes tanto para elementos individuales como múltiples dentro de un Array.
Operador in: Este operador te permite buscar valores específicos dentro de un documento. Por ejemplo, si quieres encontrar documentos donde un Array contiene ciertos valores, in es tu herramienta. También es versátil, pues no solo trabaja con Arrays, sino con valores individuales. Para ilustrarlo, usamos un find para buscar documentos dentro de un inventario donde la cantidad es ya sea 20 o 25 usando in.
db.inventory.find({quantity:{ $in:[20,25]}});
Operador nin: Actúa como el contrario de in; encuentra aquellos documentos que no contienen los valores especificados dentro del Array. Este operador garantiza que tus consultas sean precisas y te permite filtrar datos no deseados.
A diferencia de in y nin, los operadores all, size, y elemMatch están diseñados específicamente para Arrays, permitiéndote realizar consultas más sofisticadas y detalladas.
Operador all: Compara Arrays no por su contenido exacto, sino por si contienen un conjunto específico de elementos, sin importar el orden.
Operador size: Este operador centra su funcionalidad en determinar el tamaño del Array. Es ideal para cuando necesitas saber cuántos elementos contiene un Array en particular.
db.inventory.find({tags:{$size:2}});
Operador elemMatch: Si trabajas con Arrays de documentos u objetos, elemMatch permite realizar consultas más complejas, exigiendo que se cumplen varias condiciones dentro de un solo elemento del Array.
El manejo de Arrays y sus estructuras dentro de MongoDB requiere cierto nivel de pericia y comprensión de los operadores que MongoDB ofrece. Con in, nin, all, size y elemMatch, puedes aprovechar al máximo las capacidades de consulta de tu base de datos para obtener resultados precisos y eficientes. Estos operadores te permiten realizar consultas desde las más básicas hasta las más complejas dentro de tus aplicaciones.
¡Sigue explorando, sigue aprendiendo y no dudes en experimentar con estos operadores para mejorar tus habilidades con MongoDB! Con la práctica continua, te asegurarás de tener un dominio sólido sobre el manejo de Arrays y estructuras de datos complejas en MongoDB.
$in => para seleccionar documentos que tengan un campo con un valor que coincida con cualquiera de los valores especificados en un array.
$nin => selecciona documentos que no tengan un campo con un valor que coincida con ninguno de los valores especificados en un array. (Contrario a $in)
$all => selecciona documentos que tengan un campo con un array que contenga todos los valores especificados en la consulta.
$elemMatch => para seleccionar documentos que tengan un campo con un array que contenga al menos un elemento que cumpla con ciertos criterios de consulta.
$size => selecciona documentos que tengan un campo con un array de un tamaño específico.
El operador $elemMatch vendria siendo como hacer querys anidados en SQL.
Si lo podrias ver de esa forma
use("platzi_store")// operador $in (ya visto en update-arrays), para obetener elementos dentro de un array, objetos o valores especificos//db.inventory.find({ qty: { $in: [20,25]} })//db.inventory.find({// tags: { $in: ["book", "electronics"]} // //$in funcionaria como "or"// })// $nin para establecer que no traiga elementos que coincidan con la query usando este operador//db.inventory.find({ qty: { $nin: [20,25]} })// db.inventory.find({// tags: { $nin: ["book", "electronics"]} // //$in funcionaria como "or"// })// operadores que solo funcionan para arrays//db.inventory.find({ tags: "book"})//esta query debe cumplir el orden del documentos para que nos traiga exactamente lo que pedimos en la query//db.inventory.find({ tags: ["school", "book"]})// operador $all//db.inventory.find({ tags: {$all: ["book", "school"]}})// operador $size, para buscar sobre el tamano de los arrays que tengan esa cantidad de elementos//db.inventory.find({ tags: {$size: 2}})// operador $elemMatch sirve para cuando tenemos un array con objetos dentro y queremos ser exactos en la query//db.survey.find({ results: {$elemMatch: {product: "xyz"}}})db.survey.find({results:{$elemMatch:{product:"xyz",score:{$gte:7}}}})
Vamos argentina!!
El spam se mete por todos lados
Lol 😂
use("platzi_store")db.inventory.drop()db.inventory.insertMany([{_id:1,item:{name:"ab",code:"123",description:"Single line description."},qty:15,tags:["school","book","bag","headphone","appliance"]},{_id:2,item:{name:"cd",code:"123",description:"First line\nSecond line"},qty:20,tags:["appliance","school","book"]},{_id:3,item:{name:"ij",code:"456",description:"Many spaces before line"},qty:25,tags:["school","book"]},{_id:4,item:{name:"xy",code:"456",description:"Multiple\nline description"},qty:30,tags:["electronics","school"]},{_id:5,item:{name:"mn",code:"000"},qty:20,tags:["appliance","school"]},])db.survey.drop();db.survey.insertMany([{_id:1,results:[{product:"abc",score:10},{product:"xyz",score:5},],},{_id:2,results:[{product:"abc",score:8},{product:"xyz",score:7},],},{_id:3,results:[{product:"abc",score:7},{product:"xyz",score:8},],},{_id:4,results:[{product:"abc",score:7},{product:"def",score:8},],},]);
En caso de buscar un array con un size mayor o igual a un numero, como se haria?