$allO operador
$allseleciona os documentos onde o valor de um campo corresponde a todos os valores especificados. Os documentos correspondentes podem conter um campo com um valor que é uma array contendo todos os elementos especificados ou um campo com um único valor correspondente 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 $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" } ] }
Array agrupada
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" ]
Array vazia
Quando um array vazio é passado, $all não encontra nenhum documento.
Exemplos
Os exemplos nesta seção utilizam 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" } ] }
Usar $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. 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.
Exemplos adicionais
Para obter exemplos adicionais sobre como consultar arrays, consulte:
Para obter exemplos adicionais sobre queries, consulte Fazer query em documentos