$allEl operador selecciona los documentos donde el valor de un campo es una matriz que contiene todos los elementos
$allespecificados.
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 $and operación
El $all es equivalente a una operación $and de los valores especificados; es decir, la siguiente instrucción:
{ tags: { $all: [ "ssl" , "security" ] } }
es equivalente a:
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }
Arreglo anidado
Cuando se pasa un arreglo de un arreglo anidado (p. ej., [ [ "A" ] ] ), $all coincide con los documentos donde el campo contiene el arreglo anidado como un elemento (p. ej., field: [ [ "A" ], ... ]), o el campo es igual al arreglo anidado (p. ej., field: [ "A" ]).
Por ejemplo, considere la siguiente consulta 1[]:
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" ]
| [1] | La expresión $all con un solo elemento es ilustrativa, ya que la expresión es innecesaria si solo coincide $all con un elemento. En cambio, al coincidir con un solo elemento, arrayField: element es más adecuada una expresión "contiene" (es decir,). |
Ejemplos
Los siguientes ejemplos utilizan la colección inventory que contiene los 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" } ] } { _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" } ] }
Utilice $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 $all existe para brindar soporte a las queries en arreglos. Pero puedes usar el operador $all para seleccionar un elemento que no sea un arreglo field, 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 queries seleccionarán todos los documentos en la colección inventory en que el valor del campo num sea 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.