2010-07-28 12 views
5

आइए कहें कि मेरे पास मेरे कॉच डीबी डेटाबेस में दो प्रकार के दस्तावेज़ संग्रहीत हैं। सबसे पहले संपत्ति प्रकार पर और दूसरे से फ़ोन पर सेट करें। संपर्क प्रकार दस्तावेज़ में नाम की एक और संपत्ति है। फ़ोन प्रकार में गुण संख्या और contact_id है ताकि यह संपर्क व्यक्ति का संदर्भ दे सके। यह कई परिदृश्यों में छोटा है जहां एक संपर्क में एन फोन नंबर हो सकते हैं (मुझे पता है कि उन्हें एक संपर्क दस्तावेज़ में एम्बेड किया जा सकता है, लेकिन मुझे विभिन्न दस्तावेजों के साथ कई रिश्तों को प्रदर्शित करने की आवश्यकता है)।कॉच डीबी दो अलग-अलग दस्तावेज़ों से एम्बेडेड सरणी के साथ जेएसओएन ऑब्जेक्ट्स लिखने को देखें

स्कॉट 2 फ़ोन नंबर होने और मैट 1 संख्या होने के साथ कच्चे उदाहरण डेटा:

{_id: "fc93f785e6bd8c44f14468828b001109", _rev: "1-fdc8d121351b0f5c6d7e288399c7a5b6", type: "phone", number: "123456", contact_id: "fc93f785e6bd8c44f14468828b00099f"} 
{_id: "fc93f785e6bd8c44f14468828b000f6a", _rev: "1-b2dd90295693dc395019deec7cbf89c7", type: "phone", number: "465789", contact_id: "fc93f785e6bd8c44f14468828b00099f"} 
{_id: "fc93f785e6bd8c44f14468828b00099f", _rev: "1-bd643a6b0e90c997a42d8c04c5c06af6", type: "contact", name: "Scott"} 
{_id: "16309fcd03475b9a2924c61d690018e3", _rev: "1-723b7c999111b116c353a4fdab11ddc0", type: "contact", name: "Matt"} 
{_id: "16309fcd03475b9a2924c61d69000aef", _rev: "3-67193f1bfa8ed21c68e3d35847e9060a", type: "phone", number: "789456", contact_id: "16309fcd03475b9a2924c61d690018e3"} 

मानचित्र समारोह:

function(keys, values) { 
    var output = {}; 

    for(var elem in values) { 
    if(values[elem].type == "contact") { 
     output = { 
     "ID": values[elem]._id, 
     "Name": values[elem].name, 
     "Type": values[elem].type, 
     "Phones": [] 
     }; 
    } else if (values[elem].type == "phone") { 
     output.Phones.push({ 
     "Number": values[elem].number, 
     "Type": values[elem].type 
     }); 
    } 
    } 

    return output; 
} 

group_level पर सेट है:

function(doc) { 
    if (doc.type == "contact") { 
    emit([doc._id, 1], doc); 
    } else if (doc.type == "phone") { 
    emit([doc.contact_id, 0], doc); 
    } 
} 

समारोह में कमी मानचित्र फ़ंक्शन में कुंजी की वजह से 1। अब मैं इस तरह के उदाहरण के लिए शामिल किए गए फोन के साथ अपने संपर्कों को प्राप्त कर सकते हैं:

http://localhost:5984/testdb2/_design/testview/_view/tv1?group_level=1 

या इस तरह startkey और endkey के साथ कुछ संपर्क की खोज:

http://localhost:5984/testdb2/_design/testview/_view/tv1?group_level=1&startkey=[%22fc93f785e6bd8c44f14468828b00099f%22]&endkey=[%22fc93f785e6bd8c44f14468828b00099f%22,{}] 

परिणाम वास्तव में मैं कैसे चाहते हैं देखो - संपर्क करना होगा कई रिश्तों के अनुसार एम्बेडेड फोन। और यहां सवाल है: क्या यह सही तरीका है कि कॉच डीबी में मैपरेडस फ़ंक्शंस का उपयोग कैसे करें? क्या इस दृष्टिकोण का उपयोग करते समय कोई उल्लेखनीय प्रदर्शन समस्याएं हैं?

उत्तर

7

आम तौर पर आप कम डिस्क स्थान उपयोग करें यदि आप नहीं emit(...,doc) कर बोल रहा है।

आप कम से कम कार्य करने पर पुनर्विचार करना चाह सकते हैं। आपको आवश्यक डेटा प्राप्त करना वास्तव में आवश्यक नहीं है। उदाहरण के लिए, निम्न पंक्तियों के साथ कुछ कम डिस्क स्थान का उपयोग कर सकता है और यदि आपके पास बड़ी संख्या में रिकॉर्ड हैं तो बेहतर प्रदर्शन करें।

इसके अलावा, मेरा मानना ​​है कि यह CouchDB का अनाज एक को कम समारोह में और अधिक डेटा की तुलना में अपने दस्तावेज होते हैं का निर्माण करने के खिलाफ है। आप इस मामले में ऐसा नहीं कर रहे हैं लेकिन आप एक पैटर्न का पालन कर रहे हैं जो आपको बाद में परेशानी में ले जा सकता है। इसे किसी कारण के लिए कम कहा जाता है। :-)

तो कुछ इस तरह अधिक CouchDB तरीका है:

http://localhost:5984/testdb2/_design/testview/_view/tv1? 
    startkey=[%22fc93f785e6bd8c44f14468828b00099f%22, 0] 
    &endkey=[%22fc93f785e6bd8c44f14468828b00099f%22,1] 

दी, आप एक ही में परिणाम प्राप्त नहीं है: इसलिए की तरह एक विशेष संपर्क के लिए

function(doc) { 
    if (doc.type == "contact") { 
    emit([doc._id, 0], { 
     "Name": doc.name, 
     "Type": doc.type 
    }); 
    } else if (doc.type == "phone") { 
    emit([doc.contact_id, 1], { 
     "Number": doc.number, 
     "Type": doc.type 
    }); 
    } 
}

क्वेरी यह जेएसओएन संरचना पहले की तरह है लेकिन मेरा मानना ​​है कि यह कॉच डीबी के भीतर बेहतर प्रदर्शन करता है।

0

इस उत्तर पूरी तरह से मनगढ़ंत और वास्तविक है, लेकिन यह काफी वास्तव में कैसे मैं CouchDB में एक-से-कई रिश्तों के साथ काम किया है। यदि कोई स्केलिंग समस्याएं हैं, तो मैंने उन्हें अभी तक नहीं देखा है। (लेकिन मैं मानता मैं उन्हें खोजने के लिए बहुत कठिन प्रयास नहीं किया है।)

हालांकि अपने नक्शे समारोह में, क्यों आप अपने फोन (1) से संपर्क करने से पहले (0) पहले बाहर आने के लिए हल कर क्या ज़रूरत है? आपके कम करने के फ़ंक्शन को विपरीत क्रम की आवश्यकता होती है।

+0

यह इस तरह हल किया गया है क्योंकि जब मैं ब्राउज़र के माध्यम से सीधे दृश्य तक पहुंचता हूं तो मुझे यूआरएल में अवरोही = सत्य डालना होगा। – yojimbo87

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