2012-04-06 9 views
29

मेरे पास एक संग्रह नोटबुक है जिसमें नोट्स नामक सरणी दस्तावेज़ एम्बेड किया गया है। नमूनाएक मोंगोडीबी संग्रह के अंदर एक विशिष्ट एम्बेडेड दस्तावेज़ कैसे प्राप्त करें?

दस्तावेज़ नीचे दिखाए गए जैसा दिखता है।

{ 
"_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
"name" : "MongoDB", 
"notes" : [ 
      { 
       "title" : "Hello MongoDB", 
       "content" : "Hello MongoDB" 
      }, 
      { 
       "title" : "ReplicaSet MongoDB", 
       "content" : "ReplicaSet MongoDB" 
      } 
     ] 
} 

मैं केवल नोट को जानना चाहता हूं जिसमें शीर्षक "हैलो मोंगोडीबी" है। मुझे नहीं मिल रहा है

क्वेरी होना चाहिए। क्या कोई मेरी मदद कर सकता है।

उत्तर

36

पुराना उत्तर: अन्य उत्तरों देखें।


मैं नहीं मानता कि तुम क्या कह रहे हैं संभव है, कम से कम बिना कुछ नक्शे-को कम हो सकता है?

यहाँ देखें: Filtering embedded documents in MongoDB

कि इस सवाल का जवाब पता चलता है आप के लिहाज़ से अपने स्कीमा बदलने के लिए, कैसे आप डेटा के साथ काम करना चाहते हैं।

आप एक या तो "डॉट नोटेशन" या $ elemMatch उपयोग कर सकते हैं सही, दस्तावेज़ मिलान "नोट शीर्षक" है कि वापस पाने के लिए ...

> db.collection.find({ "notes.title" : "Hello MongoDB"}, { "notes.title" : 1"}); 

या ...

> db.collection.find({ "notes" : { "$elemMatch" : { "title" : "Hello MongoDB"} }}); 

लेकिन आप को पूरे सरणी पर वापस प्राप्त करेंगे, न केवल मिलान के कारण सरणी तत्व।

इसके अलावा, इसके बारे में सोचने के लिए कुछ ... आपके वर्तमान सेटअप के साथ यह सरणी में वस्तुओं पर किसी भी संचालन को करना कठिन होगा।

यदि आप अपनी स्कीमा (सुझावों से जुड़े उत्तर के रूप में) को नहीं बदलते हैं ... मैं सरणी में प्रत्येक तत्व को "आईडी" जोड़ने पर विचार करता हूं ताकि आप आवश्यकता हो तो इसे आसानी से हटाएं।

-3

आप इस तरह क्वेरी प्रदर्शन कर सकते हैं:

db.coll.find({ 'notes.title': 'Hello MongoDB' }); 

तुम भी अधिक जानकारी के लिए docs देख सकते हैं।

+8

हमम मेरा मानना ​​है कि क्या पूछा जा रहा है कि ** ** ** ** ** ** ** ** हैलो ** के साथ 'हैलो मोंगोडीबी' के साथ ** नोट ** के साथ, आपका उदाहरण नोट्स सरणी के साथ * पूरे दस्तावेज़ * को वापस लाएगा! –

73

आप इस तरह उच्च 2.2

क्वेरी मोंगो संस्करण के साथ ऐसा कर सकते हैं:

db.coll.find({ 'notes.title': 'Hello MongoDB' }, {'notes.$': 1}); 

आप आप $ या $ elemMatch उपयोग कर सकते हैं जस्टिन जेनकींस

तरह $elemMatch साथ की कोशिश कर सकते
+5

यह सही उत्तर होना चाहिए – KIC

+3

यह एम्बेडेड ऑब्जेक्ट के साथ मूल दस्तावेज़ के _id को वापस लौटाएगा जब तक कि आप क्वेरी से _id को बहिष्कृत न करें: ... {'नोट्स। $': 1, '_id': 0}); – Ushox

+0

इस क्वेरी संरचना के लिए प्रलेखन कहां उपयोग कर रहे हैं? – etech

0

। $ ऑपरेटर और $ elemMatch ऑपरेटर एक शर्त के आधार पर एक सरणी से तत्वों का सबसेट प्रोजेक्ट करता है।

$ elemMatch प्रक्षेपण ऑपरेटर एक स्पष्ट स्थिति तर्क लेता है। यह आपको क्वेरी में नहीं की स्थिति के आधार पर प्रोजेक्ट करने की अनुमति देता है।

db.collection.find(
    { 
     // <expression> 
    }, 
    { 
     notes: { 
      $elemMatch: { 
       title: 'Hello MongoDB' 
      } 
     }, 
     name: 1 
    } 
) 

$ ऑपरेटर क्वेरी स्टेटमेंट से कुछ शर्त के आधार पर सरणी तत्वों को प्रोजेक्ट करता है।

db.collection.find(
    { 
     'notes.title': 'Hello MongoDB' 
    }, 
    { 
     'notes.title.$': 1, 
     name: 1 
    } 
) 
2

आप इसे मोंगोडीबी संस्करण 3.2+ में एकत्रीकरण के साथ कर सकते हैं।

क्वेरी:

db.Notebook.aggregate(
    { 
     $project: { 
      "notes": { 
       $filter: { 
        input: "$notes", 
        as: "note", 
        cond: { 
         $eq: [ "$$note.title", "Hello MongoDB" ] 
        } 
       } 
      } 
     } 
    } 
) 

परिणाम:

{ 
    "_id" : ObjectId("4f7ee46e08403d063ab0b4f9"), 
    "notes" : [ 
     { 
      "title" : "Hello MongoDB", 
      "content" : "Hello MongoDB" 
     } 
    ] 
} 

$$ चर तक पहुँचने के लिए यहां इस्तेमाल किया। मैंने $filter के अंदर नव निर्मित note चर का उपयोग करने के लिए यहां उपयोग किया।

आप आधिकारिक दस्तावेज में $filter, $eq और $$ के बारे में अतिरिक्त जानकारी प्राप्त कर सकते हैं।

$ फिल्टर: एक सरणी के एक सबसेट निर्दिष्ट शर्त के आधार पर वापसी करने के लिए चुनता है। केवल उन तत्वों के साथ एक सरणी देता है जो स्थिति से मेल खाते हैं। लौटा तत्व मूल क्रम में हैं।

$ eq: दो मानों की तुलना करता है और मूल्य बराबर/गलत होते हैं जब मान बराबर होते हैं या नहीं (...)।

$$: चर किसी भी बीएसओएन प्रकार डेटा को पकड़ सकते हैं। चर के मान को एक्सेस करने के लिए, डबल डॉलर संकेतों ($$) के साथ प्रीफ़िक्स्ड चर नाम के साथ एक स्ट्रिंग का उपयोग करें।


नोट:

जस्टिन Jenkin का जवाब पुरानी हो चुकी है और kop का जवाब यहाँ संग्रह से एक से अधिक दस्तावेज़ वापस नहीं करता है। इस समेकन क्वेरी के साथ, यदि आवश्यक हो तो आप कई दस्तावेज़ वापस कर सकते हैं।

मुझे इसकी आवश्यकता थी और किसी की मदद करने के लिए पोस्ट करना चाहता था।

संबंधित मुद्दे

 संबंधित मुद्दे