Vou explicar isso com um exemplo. Considere a coleção
arrays
. Tem um campo chamado arr
que é uma matriz de documentos incorporados (com campos a
e b
). Alguns documentos nos
arrays
coleção:{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Eu quero encontrar todos os documentos com os campos de documento incorporado da matriz
a="a1"
E b="b1"
. Observe que isso deve estar dentro do mesmo elemento incorporado-document da matriz. Eu uso $elemMatch para isso e obter o resultado desejado. > db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
Agora, se eu usar o $and operador como na consulta a seguir, os resultados não estão corretos. Como você pode ver, um documento adicional está selecionado. A consulta funcionou com os campos de documento incorporado da matriz
a="a1"
OU b="b1"
. > db.arrays.find({$and: [ { "arr.a": "a1" }, { "arr.b": "b1" } ] } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 4, "arr" : [ { "a" : "a1", "b" : "b91" }, { "a" : "a29", "b" : "b1" } ] }
Então, usando o
$and
O operador NÃO se destina a esse propósito (ou seja, consulta em vários campos de uma matriz de subdocumentos). Além disso, para consultar um campo de documento incorporado de matriz (apenas um campo ) o
$elemMatch
não é necessário, por exemplo:> db.arrays.find( { "arr.a": "a2" } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }
{ "_id" : 2, "arr" : [ { "a" : "a1", "b" : "b11" }, { "a" : "a2", "b" : "b22" } ] }
{ "_id" : 3, "arr" : [ { "a" : "a2", "b" : "b1" }, { "a" : "a", "b" : "b1" } ] }