sql >> Database teknologi >  >> NoSQL >> MongoDB

Hent en enkelt ejendom fra dokument

I MongoDB 2.0 og ældre er dette ikke muligt. Det, du vil gøre, er at returnere et bestemt element i arrayet - men det er ikke det, din projektion rent faktisk gør, den vil bare returnere hele arrayet og derefter z-elementet for hver enkelt.

Men med 2.2 (rc2, da dette svar blev skrevet), er tingene blevet en smule bedre. Du kan nu bruge $elemMatch som en del af din projektion (se SERVER-2238 for detaljer), så du kun trækker det nødvendige array-element tilbage. Så prøv noget som dette:

db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Eller brug bare $elemMatch i selve projektionen, som du måske synes er renere:

db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns 
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }

Så nu er i det mindste det returnerede array kun det, der kun indeholder de poster, du ønsker, og du kan blot henvise til det relevante z-element (elemMatch-projektioner på et underdokument er endnu ikke understøttet).

Sidst, men ikke mindst, i 2.2 har vi aggregeringsrammen, og en af ​​de ting, den kan (med $project operator, er at omforme dine dokumenter og ændre underdokumenter og array-elementer til arrays på øverste niveau. For at få det ønskede resultat, ville du gøre noget som dette:

db.foo.aggregate( 
        {$match : {"ID":"123"}},  
        {$unwind : "$a"},  
        {$match : {"a.x":"/"}},  
        {$project : {_id : 0, z : "$a.z"}}
)

Resultatet ser således ud:

{ "result" : [ { "z" : "1000" } ], "ok" : 1 }



  1. C# MongoDB Driver:Kan ikke finde måden at køre kompleks forespørgsel for AnyIn filter i MongoDB

  2. Hvad er et godt valg af database til en lille .NET-applikation?

  3. MongoDB Tæl det samlede antal sande og falske værdier for dokumenter, der matcher en forespørgsel

  4. Spring-boot:mongoDB-datosammenligning virker ikke