$allO operador
$allseleciona 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.
Compatibilidade
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
Sintaxe
Para especificar uma expressão $all, use o seguinte protótipo:
{ <field>: { $all: [ <value1> , <value2> ... ] } }
Comportamento
Equivalente à operação $and
O operador $all é equivalente a uma operação $and para os valores especificados. Por exemplo, a seguinte declaração:
{ tags: { $all: [ "ssl" , "security" ] } }
é equivalente a:
{ $and: [ { tags: "ssl" }, { tags: "security" } ] }
Array agrupada
Quando passado um array contendo um array aninhado (por exemplo, [ [ "A" ] ]), $all corresponde a documentos onde o campo atende a uma destas condições:
O campo contém o array aninhado como um elemento, como
field: [ [ "A" ], ... ].O campo é igual ao array agrupado, como
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" ]
Array vazia
Quando um array vazio é passado, $all não encontra nenhum documento.
Exemplos
Os exemplos nesta seção usam a coleção inventory que contém os seguintes 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" } ] } ] )
Usar $all para combinar valores
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" } ] }
Use $all com $elemMatch
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. Você também pode usar $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 selecionam todos os documentos na coleção 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.
Exemplos adicionais
Para obter exemplos adicionais sobre como consultar arrays, consulte:
Para obter exemplos adicionais sobre queries, consulte Ler documentos.