sql >> Database >  >> NoSQL >> MongoDB

MongoDB:wat is het verschil tussen $elemMatch en $en om objecten in een array te vinden?

Ik zal dit uitleggen met een voorbeeld. Overweeg de verzameling arrays . Het heeft een veld genaamd arr dat is een array van ingesloten documenten (met velden a en b ).

Sommige documenten in de arrays collectie:

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

Ik wil alle documenten vinden met de array embedded-document velden a="a1" EN b="b1" . Merk op dat dit binnen hetzelfde element ingesloten-document van de array moet zijn. Ik gebruik $elemMatch hiervoor en krijg het gewenste resultaat.

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

Als ik nu de $en operator zoals in de volgende query, zijn de resultaten niet correct. Zoals u kunt zien, is er een extra document geselecteerd. De query werkte met de array embedded-document velden a="a1" OF 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" } ] }

Dus, met behulp van de $and operator is NIET bedoeld voor dit doel (d.w.z. vragen op meerdere velden van een reeks subdocumenten).

Ook om een ​​query uit te voeren op een veld in een matrix ingesloten document (slechts één veld ) de $elemMatch is niet vereist, bijvoorbeeld:

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


  1. CastError:Cast naar ObjectId mislukt voor waarde routenaam op pad _id voor model

  2. De MongoDB-foutlogboeken decoderen

  3. Uw Linux-omgeving optimaliseren voor MongoDB

  4. Schema en subdocs in mongoose.js