$allLa
$allEl operador selecciona los documentos donde el valor de un campo coincide con todos los valores especificados. Los documentos coincidentes pueden contener un campo con un valor que sea un arreglo que contenga todos los elementos especificados o un campo con un solo valor que coincida con el elemento especificado.
Compatibilidad
Puedes usar $all para implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
Para especificar una expresión $all, utiliza el siguiente prototipo:
{ <field>: { $all: [ <value1> , <value2> ... ] } }
Comportamiento
Equivalente a la Operación $and
El operador es $all $and equivalente a una operación para los valores especificados. Por ejemplo, la siguiente instrucción:
{ tags: { $all: [ "ssl" , "security" ] } }
es equivalente a:
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }
Arreglo anidado
Cuando se le pasa una matriz que contiene una matriz anidada (por ejemplo,), [ [ "A" ] ] $all coincide con los documentos donde el campo cumple cualquiera de estas condiciones:
El campo contiene el array anidado como un elemento, como por ejemplo
field: [ [ "A" ], ... ].El campo es igual al array anidado, como por ejemplo
field: [ "A" ].
Por ejemplo, considera la siguiente consulta:
db.articles.find( { tags: { $all: [ [ "ssl", "security" ] ] } } )
La query es equivalente a:
db.articles.find( { $and: [ { tags: [ "ssl", "security" ] } ] } )
que es equivalente a:
db.articles.find( { tags: [ "ssl", "security" ] } )
Por lo tanto, la expresión $all coincide con los documentos donde el campo tags es un arreglo que contiene el arreglo anidado [ "ssl",
"security" ] o es un arreglo que es igual al arreglo anidado:
tags: [ [ "ssl", "security" ], ... ] tags: [ "ssl", "security" ]
Arreglo vacío
Cuando se pasa un arreglo vacío, $all no coincide con ningún documento.
Ejemplos
Los ejemplos de esta sección utilizan la colección inventory que contiene los siguientes documentos:
db.inventory.insertMany ( [ { _id: ObjectId("5234cc89687ea597eabee675"), code: "xyz", tags: [ "school", "book", "bag", "headphone", "appliance" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 45, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("5234cc8a687ea597eabee676"), code: "abc", tags: [ "appliance", "school", "book" ], qty: [ { size: "6", num: 100, color: "green" }, { size: "6", num: 50, color: "blue" }, { size: "8", num: 100, color: "brown" } ] } { _id: ObjectId("5234ccb7687ea597eabee677"), code: "efg", tags: [ "school", "book" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 100, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("52350353b2eff1353b349de9"), code: "ijk", tags: [ "electronics", "school" ], qty: [ { size: "M", num: 100, color: "green" } ] } ] )
Utiliza $all para hacer coincidir valores
La siguiente operación utiliza el operador $all para consultar la colección inventory en busca de documentos donde el valor del campo tags es un arreglo cuyos elementos incluyen appliance, school y book:
db.inventory.find( { tags: { $all: [ "appliance", "school", "book" ] } } )
El query anterior devuelve los siguientes documentos:
{ _id: ObjectId("5234cc89687ea597eabee675"), code: "xyz", tags: [ "school", "book", "bag", "headphone", "appliance" ], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 45, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("5234cc8a687ea597eabee676"), code: "abc", tags: [ "appliance", "school", "book" ], qty: [ { size: "6", num: 100, color: "green" }, { size: "6", num: 50, color: "blue" }, { size: "8", num: 100, color: "brown" } ] }
Usa $all con $elemMatch
Si el campo contiene un arreglo de documentos, puedes usar $all con el operador $elemMatch.
La siguiente operación consulta la colección inventory para documentos en que el valor del campo qty es un arreglo cuyos elementos coinciden con los criterios de $elemMatch:
db.inventory.find( { qty: { $all: [ { "$elemMatch" : { size: "M", num: { $gt: 50} } }, { "$elemMatch" : { num : 100, color: "green" } } ] } } )
La query devuelve los siguientes documentos:
{ _id: ObjectId("5234ccb7687ea597eabee677"), code: "efg", tags: [ "school", "book"], qty: [ { size: "S", num: 10, color: "blue" }, { size: "M", num: 100, color: "blue" }, { size: "L", num: 100, color: "green" } ] } { _id: ObjectId("52350353b2eff1353b349de9"), code: "ijk", tags: [ "electronics", "school" ], qty: [ { size: "M", num: 100, color: "green" } ] }
El operador existe para admitir consultas en matrices. También puede $all usar $all para seleccionar en una matriz que no sea una field matriz, como en el siguiente ejemplo:
db.inventory.find( { "qty.num": { $all: [ 50 ] } } )
Sin embargo, usa el siguiente formulario para express la misma query:
db.inventory.find( { "qty.num" : 50 } )
Ambas consultas seleccionan todos los documentos de la colección inventory donde el valor del campo num es igual a 50.
Nota
En la mayoría de los casos, MongoDB no trata los arreglos como conjuntos. Este operador constituye una excepción destacada a este enfoque.
Ejemplos adicionales
Para obtener más ejemplos sobre la consulta de arreglos, consulte:
Para obtener ejemplos adicionales sobre query, consulta Documentos de query.