MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:qual é a diferença entre $elemMatch e $e para encontrar objetos dentro do array?


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" } ] }