$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.
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 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" } ] }
Use $all
para fazer a correspondência de 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. 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
Veja também: