sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB:¿cuál es la diferencia entre $ elemMatch y $ y para encontrar objetos dentro de la matriz?

Explicaré esto con un ejemplo. Considere la colección arrays . Tiene un campo llamado arr que es una matriz de documentos incrustados (con campos a y b ).

Algunos documentos en las arrays colección:

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

Quiero encontrar todos los documentos con la matriz de campos de documentos incrustados a="a1" Y b="b1" . Tenga en cuenta que esto debe estar dentro del mismo elemento del documento incrustado de la matriz. Yo uso $elemMatch para esto y obtener el resultado deseado.

> db.arrays.find( { arr: { $elemMatch: { a: "a1", b: "b1" } } } )
==>
{ "_id" : 1, "arr" : [ { "a" : "a1", "b" : "b1" }, { "a" : "a2", "b" : "b2" } ] }

Ahora, si uso $and operador como en la siguiente consulta, los resultados no son correctos. Como puede ver, se selecciona un documento adicional. La consulta funcionó con la matriz de campos de documentos incrustados a="a1" O 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" } ] }

Entonces, usando $and El operador NO está diseñado para este propósito (es decir, consultar varios campos de una matriz de subdocumentos).

Además, para consultar en un campo de documento incrustado de matriz (solo un campo ) el $elemMatch no es obligatorio, por ejemplo:

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