MongoDB 2.0以前では、これは不可能です。実行したいのは、配列の特定の要素を返すことです。ただし、これは実際に投影が行っていることではなく、配列全体を返し、次に各配列のz要素を返すだけです。
ただし、2.2(この回答を書いている時点ではrc2)では、状況は少し良くなっています。これで、 $elemMatch を使用できます。 予測の一部として(SERVER-2238 を参照してください。 詳細については)必要な配列要素のみをプルバックするようにします。したがって、次のようなものを試してください:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
または、プロジェクション自体で$ elemMatchを使用するだけで、よりクリーンだと思うかもしれません:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
したがって、少なくとも返される配列は、必要なエントリのみを含む配列のみであり、関連するz要素を参照するだけで済みます(サブドキュメントでのelemMatchプロジェクションはまだサポートされていません)。
最後になりましたが、2.2には、集約フレームワークと、それが実行できることの1つがあります($project
を使用)。 演算子は、ドキュメントの形状を変更し、サブドキュメントと配列要素をトップレベルの配列に変更することです。希望する結果を得るには、次のようにします。
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
結果は次のようになります:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }