Docs Menu
Docs Home
/ /
Consulta de matriz

$all

$all

El operador selecciona los documentos donde el valor de un campo es una matriz que contiene todos los elementos $all especificados.

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, 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,).

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

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