MongoDB 2.0 और पुराने में, यह संभव नहीं है। आप जो करना चाहते हैं वह सरणी का एक विशिष्ट तत्व लौटाता है - लेकिन यह वह नहीं है जो आपका प्रक्षेपण वास्तव में कर रहा है, यह केवल पूरे सरणी और फिर प्रत्येक के z तत्व को वापस कर देगा।
हालांकि, 2.2 (आरसी 2 इस उत्तर को लिखने के रूप में) के साथ, चीजें थोड़ी बेहतर हो गई हैं। अब आप $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 में हमारे पास एकत्रीकरण ढांचा है, और यह एक काम कर सकता है ($project
के साथ) ऑपरेटर, आपके दस्तावेज़ों को फिर से आकार देना और उप दस्तावेज़ों और सरणी तत्वों को शीर्ष स्तर के सरणियों में बदलना है। अपना वांछित परिणाम प्राप्त करने के लिए, आप कुछ ऐसा करेंगे:
db.foo.aggregate(
{$match : {"ID":"123"}},
{$unwind : "$a"},
{$match : {"a.x":"/"}},
{$project : {_id : 0, z : "$a.z"}}
)
परिणाम इस तरह दिखता है:
{ "result" : [ { "z" : "1000" } ], "ok" : 1 }