In MongoDB 2.0 und älter ist dies nicht möglich. Was Sie tun möchten, ist ein bestimmtes Element des Arrays zurückzugeben - aber das ist nicht das, was Ihre Projektion tatsächlich tut, sie gibt nur das gesamte Array zurück und dann das z-Element von jedem.
Mit 2.2 (rc2 zum Zeitpunkt des Schreibens dieser Antwort) sind die Dinge jedoch etwas besser geworden. Sie können jetzt $elemMatch verwenden als Teil Ihrer Projektion (siehe SERVER-2238 ). für Details), sodass Sie nur das erforderliche Array-Element zurückziehen. Versuchen Sie also Folgendes:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Oder verwenden Sie einfach $elemMatch in der Projektion selbst, was Ihrer Meinung nach sauberer ist:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Jetzt ist also zumindest das zurückgegebene Array nur dasjenige, das nur die gewünschten Einträge enthält, und Sie können einfach auf das relevante z-Element verweisen (elemMatch-Projektionen auf ein Filialdokument werden noch nicht unterstützt).
Zu guter Letzt haben wir in 2.2 das Aggregations-Framework und eines der Dinge, die es tun kann (mit dem $project
Operator, besteht darin, Ihre Dokumente umzugestalten und Unterdokumente und Array-Elemente in Arrays der obersten Ebene umzuwandeln. Um das gewünschte Ergebnis zu erhalten, würden Sie etwa so vorgehen:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
Das Ergebnis sieht so aus:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }