Trong MongoDB 2.0 trở lên, điều này là không thể. Những gì bạn muốn làm là trả về một phần tử cụ thể của mảng - nhưng đó không phải là điều mà phép chiếu của bạn thực sự đang làm, nó sẽ chỉ trả về toàn bộ mảng và sau đó là phần tử z của mỗi phần tử.
Tuy nhiên, với 2.2 (rc2 khi viết câu trả lời này), mọi thứ đã tốt hơn một chút. Giờ đây, bạn có thể sử dụng $ elemMatch như một phần của dự báo của bạn (xem SERVER-2238 để biết chi tiết) để bạn chỉ kéo lại phần tử mảng được yêu cầu. Vì vậy, hãy thử một cái gì đó như sau:
db.foo.find({"ID":"123",'a':{$elemMatch:{'x':"/"}}},{_id : 0, 'a.$': 1})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Hoặc, chỉ cần sử dụng $ elemMatch trong chính phép chiếu mà bạn có thể nghĩ là rõ ràng hơn:
db.foo.find({"ID":"123"},{_id : 0, 'a':{$elemMatch:{'x':"/"}}})
//returns
{ "a" : [ { "x" : "/", "y" : "2000", "z" : "1000" } ] }
Vì vậy, bây giờ, ít nhất mảng được trả về chỉ là mảng chỉ chứa các mục nhập bạn muốn và bạn có thể chỉ cần tham chiếu đến phần tử z có liên quan (các phép chiếu elemMatch trên một tài liệu con chưa được hỗ trợ).
Cuối cùng nhưng không kém phần quan trọng, trong 2.2 chúng ta có khung tổng hợp và một trong những điều mà nó có thể làm (với $project
, là để định hình lại tài liệu của bạn và thay đổi tài liệu con và phần tử mảng thành mảng cấp cao nhất. Để có được kết quả mong muốn, bạn sẽ làm như sau:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
Kết quả trông như thế này:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }