In MongoDB 2.0 en ouder is dit niet mogelijk. Wat u wilt doen, is een specifiek element van de array retourneren - maar dat is niet wat uw projectie feitelijk doet, het retourneert gewoon de hele array en vervolgens het z-element van elk.
Met 2.2 (rc2 vanaf het schrijven van dit antwoord) is het echter een beetje beter geworden. U kunt nu $elemMatch gebruiken als onderdeel van je projectie (zie SERVER-2238 voor details), zodat u alleen het vereiste array-element terugtrekt. Dus probeer zoiets als dit:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Of gebruik gewoon $elemMatch in de projectie zelf, waarvan u misschien denkt dat het schoner is:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Dus nu is tenminste de geretourneerde array alleen degene die alleen de gewenste items bevat en je kunt eenvoudig verwijzen naar het relevante z-element (elemMatch-projecties op een subdocument worden nog niet ondersteund).
Last but not least hebben we in 2.2 het aggregatieraamwerk, en een van de dingen die het kan doen (met het $project
operator, is om uw documenten opnieuw vorm te geven en subdocumenten en array-elementen te veranderen in arrays op het hoogste niveau. Om het gewenste resultaat te krijgen, zou je zoiets als dit doen:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
Het resultaat ziet er als volgt uit:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }