2010-11-27 11 views
8

मैंने इसे कॉच डीबी-उपयोगकर्ता मेलिंग सूची में पोस्ट किया, लेकिन मैंने सोचा कि मैं अपने नेट को थोड़ा बड़ा कर दूंगा।कॉच डीबी दृश्य: जॉइन और सबक्विरी

,

उम्मीद है कि आप में से एक स्मार्ट लोगों की मदद कर सकते (या कम से कम किसी निश्चित मुझे बता सकते हैं कि मैं क्या कोशिश कर रहा हूँ असंभव है [लिंक stackoverflow के नए उपयोगकर्ता स्पैम नियम :-(की वजह से नष्ट] और मैं विकल्प पर गौर करना होगा ... मैंने सुना है MySQL तेज चल रहा है। (-:)

पृष्ठभूमि जानकारी: मैं यहाँ एक उदाहरण डेटाबेस सेट कर लेते हैं: scoates-test.couchone.com /_utils/database.html?follow /scoates-test.couchone.com/follow

मेरे पास दो प्रकार के दस्तावेज़ हैं। प्रकार = उपयोगकर्ता और प्रकार = संपत्ति।

उदाहरण उपयोगकर्ता: scoates-test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be05f67d

उदाहरण संपत्ति: scoates-test.couchone.com/_utils/document.html?follow/c988a29740241c7d20fc7974be061d62

उपयोगकर्ता अन्य उपयोगकर्ताओं का अनुसरण कर सकते हैं (प्रकार = उपयोगकर्ता दस्तावेज़ का "निम्नलिखित" फ़ील्ड)। ऊपर के उदाहरण उपयोगकर्ता (उपयोगकर्ता नाम = बॉब) "निम्न" है 2 उपयोगकर्ताओं:

"following": [ 
    "c988a29740241c7d20fc7974be05ec54", // username=aaron 
    "c988a29740241c7d20fc7974be060bb4" // username=dale 
] 

संपत्ति एक विशिष्ट उपयोगकर्ता के स्वामित्व में हैं। उपर्युक्त उदाहरण संपत्ति का स्वामित्व c988a29740241c7d20fc7974be061d62 (उपयोगकर्ता नाम = बॉब) है।

उम्मीद है कि यह समझ में आता है।

मैं उन संपत्तियों का अनुरोध करना चाहता हूं जो बॉब का पालन कर रहे हैं (हारून और डेल), और मैं अपनी अंगुली को कोड पर नहीं डाल सकता जो इसे अनुमति देगा। मैं आसानी से उन सभी संपत्तियों को उत्सर्जित कर सकता हूं जो c988a29740241c7d20fc7974be05f67d से संबंधित हैं।

I दो अनुरोधों में कर सकता है। सबसे पहले, मैं c988a29740241c7d20fc7974be05f67d, के लिए CouchDB से पूछूंगा और उसके बाद निम्न को "कुंजी" के रूप में पोस्ट करूँगा जो उन कुंजीों से संबंधित संपत्ति लौटाता है, लेकिन आप ध्यान दें कि मेरे प्रकार = संपत्ति दस्तावेज़ों में "कब" फ़ील्ड भी है , और मैं कुंजी के रूप में [doc.owner, doc.when] उत्सर्जित करके, और फिर startKey/endKey का उपयोग करके सक्षम करने के लिए सक्षम होना चाहता हूं। तो चाबियाँ का पोस्ट बाहर है, मुझे लगता है।

मैं सिर्फ आवेदन पक्ष पर शामिल हो सकते हैं (निम्न कुंजी क्वेरी, के लिए इन कुंजियों में से प्रत्येक से एक अनुरोध करना तो तरह एप्लिकेशन की ओर), लेकिन यह वास्तव में बुरी तरह से टूट जाता है पृष्ठांकन (मैं चाहते जरूरत प्रत्येक के लिए पेज आकार की सीमा का अनुरोध करने के लिए), और यह बहुत ही पर नियंत्रण से बाहर हो जाता है (यदि कोई उपयोगकर्ता 1000 उपयोगकर्ताओं का पालन कर रहा है, तो प्रति पृष्ठ 10,000 रिकॉर्ड हैं)।

इनमें से कोई भी समाधान मेरे लिए काम नहीं करता है। मैं इसे CouchDB में करना चाहता हूं।

मैं वास्तव में स्टंप हूं। कृपया मदद करे।

एस

उत्तर

10

CouchDB बार देखा गया है, जो आपको इस तरह की समस्या का समाधान में मदद कर सकते करने के लिए एक बुनियादी नियम नहीं है।

एक CouchDB दृश्य का पता कर शून्य, एक या एक से अधिक कुंजी-मान-आईडी tuples ऐसी है कि कुंजी, मूल्य और आईडी एक ही दस्तावेज़ से गणना देता है। आप वैकल्पिक रूप से प्रदत्त आईडी के साथ दस्तावेज़ के लिए पूछ सकते हैं (जो दस्तावेज़ हो सकता है या नहीं हो सकता है जिसे टुपल की गणना करने के लिए उपयोग किया गया था)।

आप इसके बारे में सोचते हैं, यह काफी तार्किक है: हर टपल एक emit() का परिणाम थी, इसलिए सभी उत्सर्जित डेटा केवल एक ही दस्तावेज़ से आ सकता है। ,,

  • वर्तमान उपयोगकर्ता क्योंकि आप उस प्रयोक्ता
  • दस्तावेज़ के "मालिक" द्वारा दिखाई दस्तावेजों चाहते हैं, क्योंकि आप को सॉर्ट करने की जरूरत है:

    अपने विशिष्ट मामले में, आप टपल कुंजी की आवश्यकता को रोकने के लिए उस मूल्य से।

  • दस्तावेज़ का "कब", क्योंकि आपको उस मान से सॉर्ट करने की आवश्यकता है।

मौलिक नियम के अनुसार, इन सभी को रखने के लिए आपको एक सिंगल कॉच डीबी दस्तावेज़ की आवश्यकता है। आपकी वर्तमान स्कीमा ("उपयोगकर्ता" दस्तावेज़ में वर्तमान उपयोगकर्ता और दस्तावेज़ स्वामी, दस्तावेज़ स्वामी और जब "दस्तावेज़" दस्तावेज़ में) आवश्यक डेटा एकत्र नहीं करता है, तो आपको इसे बदलना होगा।

मेरे सुझाव निम्नलिखित संरचना के साथ एक "साझा" दस्तावेज़ का उपयोग करने के होगा:

{ 
    owner : 'id-of-aaron', 
    followers : [ 'id-of-bob', 'id-of-mike', 'id-of-melissa' ], 
    docs : { 
    'id-of-doc-1' : '2010-09-08', 
    'id-of-doc-2' : '2010-09-07', 
    'id-of-doc-3' : '2010-11-27' 
    } 
} 

आप जब भी कोई उपयोगकर्ता/स्वामी फ़ॉलो करता इस प्रकार है, या मालिक कहते हैं या एक को हटा इस संरचना अद्यतन रखने की जरूरत है दस्तावेज़। वहां से, आप बस उत्सर्जित कर सकते हैं:

for (var docid in doc.docs) 
    for (var i in doc.followers) { 
    emit ([doc.followers[i], doc.owner, doc.docs[docid]], { _id : docid }); 
    } 
} 
+0

प्रतिक्रिया के लिए धन्यवाद मैं इसे कुछ विचार दूंगा। अगर यह मेरी जरूरतों को पूरा करता है, तो मैं वापस आऊंगा और आपका जवाब स्वीकार करूंगा। यदि नहीं, तो मैं वापस आऊंगा और कुछ अनुवर्ती प्रश्न पूछूंगा (-: – scoates

+0

धन्यवाद! यह काम करता है। मैं वास्तव में आपको एक अच्छा समाधान देने के लिए समय निकालने की सराहना करता हूं। – scoates

+0

यह शानदार होगा अगर आप एक नज़र डाल सकें मेरे अनुवर्ती प्रश्न पर भी, धन्यवाद। धन्यवाद! http://stackoverflow.com/questions/4298937/couchdb-views-remove-duplicates-and-order-by-time – scoates

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