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 }