MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

दस्तावेज़ से एकल संपत्ति पुनर्प्राप्त करें

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 }



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. नंबरलॉन्ग और सरल इंटीजर के बीच मोंगोडीबी अंतर?

  2. मोंगोडब-नोडज ड्राइवर में दायर किए गए सभी का योग प्रदर्शित करना

  3. मोंगोइड खोजक काम नहीं कर रहे हैं?

  4. आम MongoDB साक्षात्कार प्रश्न

  5. MongoDB कुल में ऑटो वृद्धिशील फ़ील्ड कैसे जोड़ें?