2011-05-25 15 views
5

से पदानुक्रमित/नेस्टेड डेटा पुनर्प्राप्त करना मैं couchDB के लिए बहुत नया हूं और "how to store hierarchical data" पढ़ने के बाद भी यह अभी तक अभी तक क्लिक नहीं कर रहा है।कॉच डीबी

विकी में वर्णित पूर्ण पथ पैटर्न का उपयोग करने के बजाय मैं बच्चों को यूयूआईडी और माता-पिता को एक यूयूआईडी के रूप में ट्रैक रखने की उम्मीद कर रहा हूं। मैं इस पैटर्न की ओर झुका रहा हूं ताकि मैं बच्चों के क्रम में बच्चों के क्रम को अपने पदों से बनाए रख सकूं।

सोफे में कुछ नमूना दस्तावेज़ यहां दिए गए हैं, बाल्टी में बाल्टी और आइटम हो सकते हैं, वस्तुओं में केवल अन्य आइटम हो सकते हैं। (UUIDs स्पष्टता के लिए संक्षिप्त):

{_id: 3944 
name: "top level bucket with two items" 
type: "bucket", 
parent: null 
children: [8989, 4839] 
} 
{_id: 8989 
name: "second level item with no sub items" 
type: "item" 
parent: 3944 
} 
{ 
_id: 4839 
name: "second level bucket with one item" 
type: "bucket", 
parent: 3944 
children: [5694] 
} 
{ 
_id: 5694 
name: "third level item (has one sub item)" 
type: "item", 
parent: 4839, 
children: [5390] 
} 
{ 
_id: 5390 
name: "fourth level item" 
type: "item" 
parent: 5694 
} 

यह एक नक्शे के समारोह के भीतर एक एम्बेडेड दस्तावेज़ आईडी द्वारा एक दस्तावेज को देखने के लिए संभव है?

function(doc) { 
    if(doc.type == "bucket" || doc.type == "item") 
     emit(doc, null); // still working on my key value output structure 
     if(doc.children) { 
      for(var i in doc.children) { 
       // can i look up a document here using ids from the children array? 
       doc.children[i]; // psuedo code 
       emit(); // the retrieved document would be emitted here 
      } 
     } 
    } 
} 

एक आदर्श दुनिया में अंतिम JSON आउटपुट कुछ ऐसा दिखाई देगा।

{"_id":3944, 
"name":"top level bucket with two items", 
"type":"bucket", 
"parent":"", 
"children":[ 
    {"_id":8989, "name":"second level item with no sub items", "type":"item", "parent":3944}, 
    {"_id": 4839, "name":"second level bucket with one item", "type":"bucket", "parent":3944, "children":[ 
     {"_id":5694", "name":"third level item (has one sub item)", "type":"item", "parent": 4839, "children":[ 
      {"_id":5390, "name":"fourth level item", "type":"item", "parent":5694} 
     ]} 
    ]} 
] 
} 

उत्तर

6

आप एक सामान्य चर्चा on the CouchDB wiki पा सकते हैं। के रूप में CouchDB documentation में विस्तार से बताया, दस्तावेज प्राप्त करने के लिए

function(doc) { 
    if (doc.type === "bucket" || doc.type === "item") 
     emit([ doc._id, -1 ], 1); 
     if (doc.children) { 
      for (var i = 0, child_id; child_id = doc.children[i]; ++i) { 
       emit([ doc._id, i ], { _id: child_id }); 
      } 
     } 
    } 
} 

आप include_docs=true साथ क्वेरी चाहिए: अगर अपने नक्शे

मैं अभी यह परीक्षण करने के लिए समय नहीं है, फिर भी अपने नक्शे समारोह कुछ ऐसा दिखाई देगा फ़ंक्शन 0 ऑब्जेक्ट वैल्यू को उत्सर्जित करता है जिसमें {'_id': XXX} है और आप include_docs=true पैरामीटर के साथ क्वेरी देखते हैं, तो CouchDB दस्तावेज़/दस्तावेज़ जोड़ी को निकालने के लिए संसाधित किए गए दस्तावेज़ के बजाय दस्तावेज़ को XXX XXX के साथ लाएगा।

अपने बच्चों के साथ आईडी "3 9 44" के साथ केवल दस्तावेज़ प्राप्त करने के लिए startkey=["3944"]&endkey["3944",{}] जोड़ें।

संपादित करें: अधिक जानकारी के लिए this question पर एक नज़र डालें।

+0

मार्सेलो की मदद के लिए धन्यवाद। जब मैं नक्शा फ़ंक्शन चलाता हूं तो आउटपुट घोंसला नहीं होता है क्योंकि मैं उम्मीद कर रहा था, यह सब फ्लैट है। कोई विचार? – berg

+0

मेरा उत्तर है [यहां] (http://stackoverflow.com/questions/6084741/how-to-merge-view-collation-into-useful-output-in-couchdb/6094540#6094540)। हालांकि मैं इसे पुनः प्राप्त नहीं करता हूं। नेस्टेड सूची का क्या फायदा है? फ्लैट सूची का आदेश दिया जाता है ताकि प्रत्येक "आइटम" या "बाल्टी" तुरंत अपने बच्चों द्वारा अनुरोधित आदेश में पीछा किया जा सके। यह इस सूची को पार करने के लिए बहुत आसान और कुशल है। आपको नेस्टेड सूची की आवश्यकता क्यों है? हो सकता है कि मैं आपको एक बेहतर समाधान दे सकता हूं। –

+0

मैं अपने क्लाइंट साइड जावास्क्रिप्ट कोड में सीधे परिणामों का उपयोग करने की उम्मीद कर रहा था, जो डेटा को घोंसला वापस आने की उम्मीद कर रहा है। लेकिन आपके द्वारा लिंक किए गए प्रश्न को पढ़ने के बाद यह लगता है कि यह कॉच डीबी के अनाज के खिलाफ चला जाता है, इसलिए मैं इस ग्राहक पक्ष को करने की योजना बनाउंगा! धन्यवाद फिर से मैं इसे जवाब के रूप में चिह्नित करूंगा! – berg

6

क्या आप एक दृश्य से वृक्ष संरचना का उत्पादन कर सकते हैं? नहीं। कॉच डीबी व्यू प्रश्न मूल्यों की एक सूची लौटाते हैं, उन्हें सूची के अलावा अन्य कुछ भी आउटपुट करने का कोई तरीका नहीं है। इसलिए, आपको किसी दिए गए बाल्टी के सभी वंशजों की सूची लौटने के अपने मानचित्र से निपटना होगा।

हालांकि, आप दृश्य के बाद _list पोस्ट-प्रोसेसिंग फ़ंक्शन को प्लग कर सकते हैं, उस सूची को वापस घोंसला वाली संरचना में बदल सकते हैं। यह संभव है यदि आपके मान अपने माता-पिता — के बारे में जानते हैं तो एल्गोरिदम काफी सरल है, अगर यह आपको परेशानी देता है तो बस एक और प्रश्न पूछें।

क्या आप मानचित्र आईडी में अपनी आईडी द्वारा दस्तावेज़ ले सकते हैं? नहीं। कॉच डीबी के भीतर से अपने पहचानकर्ता द्वारा दस्तावेज़ को पकड़ने का कोई तरीका नहीं है। अनुरोध दस्तावेज पहचानकर्ता पर मानक GET के रूप में, या दृश्य अनुरोध पर include_docs=true जोड़कर, आवेदन से आना चाहिए।

इसके लिए तकनीकी कारण बहुत आसान है: दस्तावेज़ बदलते समय CouchDB केवल मानचित्र फ़ंक्शन चलाता है। यदि दस्तावेज़ A को दस्तावेज़ B लाने की अनुमति थी, तो B परिवर्तनों पर उत्सर्जित डेटा अमान्य हो जाएगा।

क्या आप सभी नोडों के माता-पिता की सूची संग्रहीत किए बिना सभी वंशजों को आउटपुट कर सकते हैं? नहीं। CouchDB मानचित्र फ़ंक्शंस डेटाबेस में प्रत्येक दस्तावेज़ के लिए कुंजी-मान-आईडी जोड़े का एक सेट उत्सर्जित करता है, इसलिए कुंजी और आईडी के बीच पत्राचार एक दस्तावेज़ के आधार पर निर्धारित किया जाना चाहिए।

आप एक चार स्तर वृक्ष संरचना A -> B -> C -> D है लेकिन केवल एक नोड अपने माता-पिता और बच्चों के बारे में पता है, तो नोड्स में से कोई भी ऊपर जानते हैं कि DA का वंशज है करते हैं, तो आप फेंकना नहीं कर सकेंगे D की आईडी A पर आधारित एक कुंजी के साथ और इस प्रकार यह आउटपुट में दिखाई नहीं देगी।

तो, आप तीन विकल्प हैं:

  • ले लो केवल तीन स्तरों (यह संभव है क्योंकि B जानता है कि CA का वंशज है), और क्वेरी को फिर से चलाने से अतिरिक्त स्तर हड़पने।
  • किसी भी तरह नोड के भीतर प्रत्येक नोड के वंशजों की सूची संग्रहित करें (यह महंगा है)।
  • नोड के भीतर प्रत्येक नोड के माता-पिता की सूची स्टोर करें।