V MongoDB 2.0 a starších to není možné. Co chcete udělat, je vrátit konkrétní prvek pole – ale to není to, co vaše projekce ve skutečnosti dělá, vrátí pouze celé pole a poté prvek z každého z nich.
Nicméně s 2.2 (rc2 v době psaní této odpovědi) se věci trochu zlepšily. Nyní můžete používat $elemMatch jako součást vaší projekce (viz SERVER-2238 podrobnosti), takže vytáhnete zpět pouze požadovaný prvek pole. Takže zkuste něco takového:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Nebo jednoduše použijte $elemMatch v samotné projekci, o které si možná myslíte, že je čistší:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Nyní tedy alespoň vrácené pole je pouze pole obsahující pouze položky, které chcete, a můžete jednoduše odkazovat na příslušný prvek z (projekce elemMatch na vnořeném dokumentu zatím nejsou podporovány).
V neposlední řadě máme ve verzi 2.2 agregační rámec a jednu z věcí, které umí (s $project
je přetvořit vaše dokumenty a změnit dílčí dokumenty a prvky pole na pole nejvyšší úrovně. Chcete-li dosáhnout požadovaného výsledku, udělali byste něco takového:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
Výsledek vypadá takto:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }