Docs Menu
Docs Home
/ /
Consulta de matriz

$all

$all

El operador $all 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 incluya todos los elementos especificados o un campo con un valor único que coincida con el elemento especificado.

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.

Para especificar una expresión $all, utiliza el siguiente prototipo:

{ <field>: { $all: [ <value1> , <value2> ... ] } }

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" } ] }

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, 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" ]

Cuando se pasa un arreglo vacío, $all no coincide con ningún documento.

Los ejemplos en 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" }
]
}
] )

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" }
]
}

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.

Para obtener más ejemplos sobre la consulta de arreglos, consulte:

Para obtener ejemplos adicionales sobre query, consulta Documentos de query.

Tip

Volver

Consulta de matriz

En esta página