$tudo
$all
O operador
$all
seleciona os documentos em que o valor de um campo é uma array que contém todos os elementos especificados.
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 à $and
operação
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 [1]:
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" ]
[1] | A expressão $all com um elemento único é para fins ilustrativos, pois a expressão $all é desnecessária se corresponder somente a um único elemento. Em vez disso, ao combinar um único elemento, uma expressão "contém" (ou seja, arrayField: element ) é mais adequada. |
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" } ] }
Usar $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 com <a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \"> $all
$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