Di MongoDB 2.0 dan yang lebih lama, ini tidak mungkin. Yang ingin Anda lakukan adalah mengembalikan elemen tertentu dari larik - tetapi bukan itu yang sebenarnya dilakukan oleh proyeksi Anda, itu hanya akan mengembalikan seluruh larik dan kemudian elemen z dari masing-masingnya.
Namun, dengan 2.2 (rc2 pada saat menulis jawaban ini), segalanya menjadi sedikit lebih baik. Sekarang Anda dapat menggunakan $elemMatch sebagai bagian dari proyeksi Anda (lihat SERVER-2238 untuk detailnya) sehingga Anda hanya menarik kembali elemen array yang diperlukan. Jadi, coba sesuatu seperti ini:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Atau, cukup gunakan $elemMatch dalam proyeksi itu sendiri, yang mungkin menurut Anda lebih bersih:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Jadi, sekarang, setidaknya larik yang dikembalikan hanyalah larik yang hanya berisi entri yang Anda inginkan dan Anda cukup mereferensikan elemen z yang relevan (proyeksi elemMatch pada subdokumen belum didukung).
Last but not least, di 2.2 kami memiliki kerangka kerja agregasi, dan salah satu hal yang dapat dilakukan (dengan $project
operator, adalah untuk membentuk kembali dokumen Anda dan mengubah sub dokumen dan elemen larik menjadi larik tingkat atas. Untuk mendapatkan hasil yang Anda inginkan, Anda akan melakukan sesuatu seperti ini:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
Hasilnya terlihat seperti ini:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }