W MongoDB 2.0 i starszych nie jest to możliwe. To, co chcesz zrobić, to zwrócić określony element tablicy - ale nie to właśnie robi twoja projekcja, zwróci po prostu całą tablicę, a następnie element z każdego z nich.
Jednak w wersji 2.2 (rc2 w momencie pisania tej odpowiedzi) sprawy nieco się poprawiły. Możesz teraz używać $elemMatch jako część Twojej projekcji (patrz SERVER-2238 aby uzyskać szczegółowe informacje), aby wycofać tylko wymagany element tablicy. Spróbuj więc czegoś takiego:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Lub po prostu użyj $elemMatch w samej projekcji, która może wydawać się czystsza:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Więc teraz przynajmniej zwrócona tablica jest tylko tą, która zawiera tylko żądane wpisy i możesz po prostu odwołać się do odpowiedniego elementu z (prognozy elemMatch na poddokumencie nie są jeszcze obsługiwane).
Wreszcie, w wersji 2.2 mamy strukturę agregacji i jedną z rzeczy, które może zrobić (za pomocą $project
operatora, jest zmiana kształtu dokumentów i zmiana poddokumentów i elementów tablicy na tablice najwyższego poziomu. Aby uzyskać pożądany wynik, zrobiłbyś coś takiego:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
Wynik wygląda tak:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }