sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB:vad är skillnaden mellan $elemMatch och $och att hitta objekt i arrayen?

Jag kommer att förklara detta med ett exempel. Tänk på samlingen arrays . Den har ett fält som heter arr som är en rad inbäddade dokument (med fält a och b ).

Vissa dokument i arrays samling:

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

Jag vill hitta alla dokument med fälten för array inbäddade dokument a="a1" OCH b="b1" . Observera att detta måste vara inom samma element inbäddade dokument i arrayen. Jag använder $elemMatch för detta och få önskat resultat.

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

Nu, om jag använder $and operatör som i följande fråga, är resultaten inte korrekta. Som du kan se är ett ytterligare dokument valt. Frågan fungerade med fälten för array inbäddade dokument a="a1" ELLER 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" } ] }

Så, med hjälp av $and operatören är INTE avsedd för detta ändamål (dvs. frågar på flera fält i en rad underdokument).

Dessutom, för att fråga på ett fält för inbäddade array-dokument (endast ett fält ) $elemMatch krävs inte, till exempel:

> 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. MongoDB tillhandahåller ett grundläggande autentiseringssystem. Har det ändrats i version 2.2.3?

  2. Hur man frågar mongodb Date med php

  3. Hur man tar bort overifierade användare med Mongoose och TTL

  4. MongoDB sortering vs aggregerad $sort på arrayindex