Menu Docs

$tudo

$all

O operador $all seleciona os documentos onde o valor de um campo corresponde a todos os valores especificados. Os documentos correspondentes podem conter um campo cujo valor seja um array contendo todos os elementos especificados, ou um campo com um único valor que corresponda ao elemento especificado.

Você pode utilizar o $all para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

Para especificar uma expressão $all, use o seguinte protótipo:

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

O $all é equivalente a uma operação $and dos valores especificados; ou seja, a seguinte declaração:

{ tags: { $all: [ "ssl" , "security" ] } }

é equivalente a:

{ $and: [ { tags: "ssl" }, { tags: "security" } ] }

Quando passou uma array de uma array agrupada (por exemplo [ [ "A" ] ] ), $all corresponde a documentos em que o campo contém a array agrupada como um elemento (por exemplo field: [ [ "A" ], ... ]) ou o campo é igual à array agrupada (por exemplo, field: [ "A" ]).

Por exemplo, considere a seguinte query:

db.articles.find( { tags: { $all: [ [ "ssl", "security" ] ] } } )

A query é equivalente a:

db.articles.find( { $and: [ { tags: [ "ssl", "security" ] } ] } )

que é equivalente a:

db.articles.find( { tags: [ "ssl", "security" ] } )

Dessa forma, a expressão $all corresponde a documentos em que o campo tags é uma array que contém a array agrupada [ "ssl", "security" ] ou é uma array igual à array agrupada:

tags: [ [ "ssl", "security" ], ... ]
tags: [ "ssl", "security" ]

Quando um array vazio é passado, $all não encontra nenhum documento.

Os seguintes exemplos utilizam a collection inventory que contém os 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" }
]
}

A seguinte operação utiliza o operador $all para consultar a collection inventory para documentos onde o valor do campo tags é uma array cujos elementos incluem appliance, school e book:

db.inventory.find( { tags: { $all: [ "appliance", "school", "book" ] } } )

A query acima retorna os seguintes 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" }
]
}

Se o campo contiver uma array de documentos, você poderá usar $all com o operador $elemMatch.

A operação a seguir faz uma query da collection inventory para documentos em que o valor do campo qty é uma array cujos elementos correspondem aos critérios $elemMatch:

db.inventory.find( {
qty: { $all: [
{ "$elemMatch" : { size: "M", num: { $gt: 50} } },
{ "$elemMatch" : { num : 100, color: "green" } }
] }
} )

A consulta retorna os seguintes 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" }
]
}

O operador $all existe para dar suporte a queries sobre arrays. Mas você pode usar o operador $all para selecionar em relação a um field que não seja uma array, como no exemplo a seguir:

db.inventory.find( { "qty.num": { $all: [ 50 ] } } )

No entanto, use o formato a seguir para expressar a mesma query:

db.inventory.find( { "qty.num" : 50 } )

Ambas as queries selecionarão todos os documentos na collection inventory onde o valor do campo num é igual a 50.

Observação

Na maioria dos casos, o MongoDB não trata as arrays como conjuntos. Este operador fornece uma exceção notável a esta abordagem.

Para obter exemplos adicionais sobre como consultar arrays, consulte:

Para obter exemplos adicionais sobre queries, consulte Fazer query em documentos

Veja também: