2011-04-06 15 views
26

से विशेष तत्व जाओ मैं की तरहMongoDB सरणी

नीचे
{ 
    "auther" : "xyz" , 
    "location" : "zzz" , 
    "books" : 
    [ 
     {"book1" : "b1" , "date" : 2-3-00} , 
     {"book1" : "b2" , "date" : 4-9-00} 
    ] 
} 

{ 
    "auther" : "pqr", 
    "location" : "zzz" , 
    "books" : 
    [ 
     {"book1" : "b1" , "date" : 2-4-00} 
    ] 
} 

मैं केवल पुस्तक बी 1 और लेखक xyz की तारीख प्राप्त करना चाहते हैं मोंगो संग्रह है।

मैं बनाने के लिए है की तरह के रूप में

"books" : {"date" : 2-4-00} , "books" : {"date" : 4-9-00} 

इस प्रकार नीचे

db.coll.find({"auther" : "xyz" , "books.book1" : "b1"} , {"books.date" : 1}) 

लेकिन यह है उत्पादन देता है मैं सिर्फ किताब बी 1 और अन्य xyz .means केवल "books" : {"date" : 2-4-00}

की तारीख प्राप्त करना चाहते क्वेरी

क्या यह मोंगो में संभव है या क्या मैं कुछ गलत कर रहा हूं?

उत्तर

22

MongoDB क्वेरी भाषा सभी मिलान दस्तावेज़ों को वापस करने के लिए डिज़ाइन की गई है।

केवल उप-दस्तावेज लौटने के लिए कोई समर्थन नहीं है।

इस समस्या में मोंगोडीबी के टिकट ट्रैकर में outstanding ticket है।


अद्यतन: ऐसा लगता है कि टिकट तय के रूप में चिह्नित किया गया है।

इसका उपयोग करने के उदाहरण के लिए here देखें।

+0

इस दौरान यह तय किया गया है; http://stackoverflow.com/questions/3985214/mongodb-extract-only-the-selected-item-in-array –

+1

@DanDascalescu अपडेट के लिए धन्यवाद, मैंने मूल को अपडेट किया है। –

+0

यह पता लगाने के लिए दूसरा पैरामीटर निर्दिष्ट करता है कि कौन से फ़ील्ड पुनर्प्राप्त करना है, जो प्रभावी रूप से निर्दिष्ट करता है कि आपको कौन से उप-दस्तावेज़ों की आवश्यकता है। – Leopd

5

इसे मानचित्र/घटाकर उपयोग करके किया जा सकता है, बस उप तत्व को अस्थायी इनलाइन संग्रह में छोड़ दें। यह एक हैक है और यह काम करता है हालांकि मैं इसके खिलाफ सलाह दूंगा क्योंकि नक्शा/कमजोर सिंगल थ्रेडेड है, और जो आप प्राप्त करना चाहते हैं उसके लिए एक बड़ा ओवरहेड है, यह आपके एप्लिकेशन में उप-तत्व निकालने के लिए बहुत आसान है।

कुछ इस तरह ...

नक्शा:

m = function() { 
    this.books.forEach(function(book){ 
     if(book1 == 'b1'){ 
      emit("books", {date: book.date,}); 
     } 
    }); 
} 

को कम:

r = function(key, values) { 
     return this; 
    } 

क्वेरी:

 
    db.coll.mapReduce(m, r, {query : {"auther" : "xyz" , "books.book1" : "b1"}, out: { inline : 1}}) 

3

अगर आप केवल तत्व आप मिलान का चयन करना चाहते इस तरह से पूछ सकते हैं।

b.coll.find ({ "लेखक": "xyz", "books.book1": "बी 1"}, { "किताबें $ तिथि।।": 1})

1

एक छोटे से कल्पना (पूर्व मोंगो v 2.6) ...

के साथ आप समेकित रूप के साथ ऐसा कर या कम करने मैप कर सकते हैं। कुल नया, आसान और अधिक अनुकूलित है। यहां एक उप दस्तावेज़ को वापस करने का नमूना दिया गया है, जिसमें यह माना जाता है कि आपके संग्रह को "लेखक" नाम दिया गया है। मैंने वर्तनी की चीजों की स्वतंत्रता को सही ढंग से लिया।

Authors.aggregate([ 
    { $match: { author: 'xyz' } }, 
    { $unwind: '$books' }, 
    { 
    $project: { 
     _id: '$books.book1', 
     date: '$books.date' 
    } 
    }, 
    { $match: { '$_id' : 'b1' } } 
]); 

तुम इतनी तरह एक एकल प्रवेश के साथ एक सरणी वापस मिल जाएगा:

[{ _id: 'b1', date: '2-4-00' }] 

अन्यथा, यदि मोंगो 2.6+ तुम सच में आसान तरीका कर सकते हैं:

Authors.find({ 
    author: 'xyz', 
    books: { $elemMatch: { book1: 'b1' } } 
},'books') 

यदि आप पाए जाते हैं तो पुस्तकें संग्रह वापस प्राप्त करेंगे और केवल एक ही रिकॉर्ड:

{ _id: 'xyz', books: [ { book1: 'b1', date: '2-4-00' } ] }