2009-07-24 5 views
5

मैं उपयोग कर रहा हूँ क्या एक में शामिल होने के दृश्य बनाने के लिए एक आम चाल हो रहा है:एक कंपाउंड कॉच डीबी कुंजी के लिए अधिकतम मूल्य क्या है?

// a Customer has many Orders; show them together in one view: 
function(doc) { 
    if (doc.Type == "customer") { 
    emit([doc._id, 0], doc); 
    } else if (doc.Type == "order") { 
    emit([doc.customer_id, 1], doc); 
    } 
} 

मैं जानता हूँ कि मैं एक ही customer और सभी संबंधित Order रों प्राप्त करने के लिए निम्न क्वेरी का उपयोग कर सकते हैं:

?startkey=["some_customer_id"]&endkey=["some_customer_id", 2] 

लेकिन अब मैंने अपनी क्वेरी बहुत मेरे व्यू कोड को बारीकी से बांध लिया है। क्या कोई मूल्य है जहां मैं अपना "2" डाल सकता हूं और अधिक स्पष्ट रूप से कहता हूं, "मुझे सब कुछ इस ग्राहक से जुड़ा हुआ है"? मुझे लगता है मैं

?startkey=["some_customer_id"]&endkey=["some_customer_id", {}] 

देखा है लेकिन मुझे यकीन है कि {}कुछ है सॉर्ट करने के लिए किसी और के बाद सब कुछ नहीं कर रहा हूँ।

जॉइन विधि के लिए cmlenz पर क्रेडिट। CouchDB wiki page on collation से

आगे स्पष्टीकरण:

क्वेरी startkey=["foo"]&endkey=["foo",{}] ऐसे ["foo","bar"] और ["foo",["bar","baz"]] के रूप में "foo" पहला तत्व के साथ सबसे सरणी कुंजी से मेल खाएंगे। हालांकि यह नहीं पिछले से मेल खाएगी नहीं ["foo",{"an":"object"}]

तो {}देर सॉर्ट क्रम में है, लेकिन निश्चित रूप से।

उत्तर

1

बल्कि अपने सरणी कुंजी में दूसरा तत्व के लिए सबसे बड़ी संभव मूल्य खोजने की कोशिश की तुलना में, मैं बजाय कम से कम संभव से पहले अधिक से अधिक मूल्य खोजने की कोशिश सुझाव है।

+0

नोट "inclusive_end" हास्यास्पद मामले में जहां आप वास्तव में फार्म "some_customer_id \ u0000" की एक प्रमुख, "endkey" परिणाम में मिलान दस्तावेजों सहित नहीं द्वारा राशि के खिलाफ गार्ड। – user359996

0

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

चूंकि कॉच डीबी जेएसओएन का उपयोग करके सबकुछ स्टोर करता है, यह संभवतः ईसीएमएस्क्रिप्ट मानक द्वारा सबसे बड़ी संख्या मानों तक ही सीमित है। जावास्क्रिप्ट में सभी संख्याओं को एक फ्लोटिंग पॉइंट आईईईई 754 डबल के रूप में संग्रहीत किया जाता है। मेरा मानना ​​है कि 64-बिट डबल मूल्यों का प्रतिनिधित्व कर सकता है - 5e-324 से + 1.7976931348623157e + 308।

+0

शायद मैं पर्याप्त स्पष्ट नहीं था। उस ग्राहक के लिए आईडी न्यूनतम और अधिकतम मानों के बीच नहीं बदलती है। हालांकि, कॉच डीबी यौगिक कुंजी की अनुमति देता है। यह पहली प्रविष्टि (यहां निरंतर, और "some_customer_id" के बराबर) द्वारा पहले आदेश देता है, फिर दूसरा (प्रारंभ कुंजी के लिए शून्य, 2 या {} के लिए शून्य), और इसी तरह। मैं सोच रहा हूं कि (और क्यों) {} कोचडीबी के आदेश में एक कुंजी के लिए अधिकतम संभव मूल्य है। –

+0

मुझे लगता है कि समस्या मेरे प्रश्न शीर्षक में है - मैं स्पष्टता के लिए नाम बदलूंगा। –

+0

ओह मैंने नहीं देखा कि आप समग्र कुंजी के बारे में बात कर रहे थे। कॉच डीबी पर थोड़ी सी सीमाएं हैं, मुझे संदेह है कि समग्र कुंजी के लिए ट्यूपल के आकार पर एक कठिन सीमा है। मेरा मानना ​​है कि कुछ डीबी संचालन के लिए सिस्टम संसाधनों का परीक्षण किया जाएगा यदि आपने संयुक्त सूचकांक के हिस्से के रूप में हजारों फ़ील्ड और सैकड़ों फ़ील्ड के साथ एक टेबल बनाई है। –

0

ऐसा लगता है कि एक ऐसा सुविधा होना अच्छा लगेगा जहां एंडकी विशेष रूप से समावेशी हो।

+0

असल में, "एंडकी" डिफ़ॉल्ट रूप से समावेशी है। अनन्य व्यवहार प्राप्त करने के लिए आपको "endkey_inclusive = false" निर्दिष्ट करना होगा। – user359996

0

इस चाल करना चाहिए:

?startkey=["some_customer_id"]&endkey=["some_customer_id", "\uFFFF"] 

यह कुछ भी है कि \ uFFFF से कम एक चरित्र के साथ शुरू होता शामिल होना चाहिए (सभी यूनिकोड वर्ण)

+2

मुझे ऐसा नहीं लगता है। आपके द्वारा लिंक किया गया लेख कहता है कि सभी तार सभी सरणी से पहले आते हैं, जो बदले में सभी हैश के सामने आते हैं। तो ["some_customer_id", "\ uFFFF"] 'से कम' ["some_customer_id", {}] है। –

+0

कैसे करें:?कुंजी = [ "some_customer_id"] और include_docs = सच – bogphanny

+0

यह एक संबंधपरक डेटाबेस क्वेरी नहीं है। अल्पविराम एक अंतर्निहित संयोजन नहीं है। इस दृश्य के लिए उत्सर्जित सभी कुंजियां दो-तत्व सरणी हैं, इसलिए आपकी क्वेरी से कोई परिणाम नहीं मिलेगा। – user359996

2

मेरे पास है दो विचार

उपयोग के बजाय सरल 0 और 1 का उपयोग कर अपने मिलान व्यवहार के लिए की

मुहर, एक टाइमस्टैम्प कि रिकॉर्ड बनाया गया था (वे रिकॉर्ड का हिस्सा हैं यह सोचते हैं) एक ला [doc._id, doc.created_at] का उपयोग करें। फिर आप अपने दृश्य को कुछ पर्याप्त प्रारंभिक तारीख (युग शायद काम करेंगे) की स्टार्टकी के साथ पूछ सकते हैं, और "अब" की एक अंतकी, उदाहरण के लिए date +%s। उस महत्वपूर्ण सीमा में हमेशा सबकुछ शामिल होना चाहिए, और इसमें तिथि से टकराने का अतिरिक्त लाभ है, जो शायद वैसे भी है जो आप चाहते हैं।

या, बस इसे

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

माणिक में उदाहरण के लिए:

customer_records = records.delete_if { |record| record.type == "customer" }

फिर भी, timestamps शायद अपने मामले के लिए और अधिक आकर्षक जवाब है। ?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false:

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