2011-01-13 14 views
5

मेरे पास निम्न परिभाषा के साथ "record_by_date_product" एक couchdb दृश्य है:एक समग्र कुंजी का उपयोग कर एक couchdb दृश्य पूछने के लिए कैसे?

function(doc) { 
    emit([doc.logtime, doc.product_id], doc); 
} 

मैं एक क्वेरी चलाने की कोशिश कर रहा हूं जो कुछ ऐसा है:

(logtime > fromdate & logtime < todate) & product_id in (1,2,6) 

क्या यह इस दृश्य के साथ संभव है?

मैं couchdb तक पहुंचने के लिए couchdb पायथन लाइब्रेरी का भी उपयोग कर रहा हूं। यहां एक कोड स्निपेट है:

server = couchdb.Server() 
db = server['mydb'] 

results = db.view('_design/record_by_date_product/_view/record_by_date_product') 

यह पृष्ठ http://packages.python.org/CouchDB/client.html#viewresults निर्दिष्ट करता है कि हम स्टार्टकी और एंडकी का उपयोग कर सकते हैं। लेकिन मैं इसे काम नहीं कर पा रहा हूं।

धन्यवाद

उत्तर

5

मुझे लगता है कि मैं सिर्फ सही जवाब मिला:

डिजाइन एक दृश्य 'sampleview' जो की तरह है:

{ 
    "records_by_date_product": { 
     "map": "function(doc) {\n emit([doc.prod_id, doc.logtime], doc);\n}" 
    } 
} 

हमें का कहना है कि क्वेरी पैरामीटर हैं करते हैं:

prod_id in [1,3] 
from_date = '2010-01-01 00:00:00' 
to_date = '2010-01-02 00:00:00' 

फिर आपको एक ही दृश्य पर 2 अलग-अलग प्रश्नों को चलाने होंगे:

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]' 

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]' 

ध्यान दें कि एक ही क्वेरी प्रत्येक बार चलती है सिवाय इसके कि prod_id दूसरी क्वेरी में बदल दिया गया है। परिणाम बाद में collated किया जाना है। उम्मीद है की यह मदद करेगा!

+1

आप केवल एक ही व्यक्ति हैं, है ना? आपने अभी अपने प्रश्न का उत्तर दिया और कहा "आशा है कि इससे मदद मिलती है।" वैसे भी, यह काम नहीं करेगा, क्योंकि चाबियों का क्रम गलत है। '[Start_date, 1]' और '[end_date, 1] 'के बीच की सीमा में ऐसी कई चीज़ें शामिल होंगी जिन्हें आप नहीं चाहते हैं, जैसे कि उत्पाद आईडी = 2 के लिए दिनांक सीमा में सबकुछ। यदि आप तिथि से पहले उत्पाद आईडी को छोड़ देते हैं तो यह * काम करेगा * काम करेगा। –

+0

हेहे! मैंने सोचा कि यह दूसरों की भी मदद करेगा! :) आप सही हैं, मुझे कुंजी ऑर्डर को रिवर्स करना होगा और फिर दृश्य को क्वेरी करना होगा। मुझे समाधान में एक संपादन करने दें। धन्यवाद! –

3

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

इस क्वेरी के लिए आपको जिस रणनीति का उपयोग करना चाहिए वह डेटा की विशेषताओं पर निर्भर करता है। सबसे महत्वपूर्ण बात यह है कि यदि आप कुंजी के पहले भाग (logtime) का उपयोग करते हैं और पाइथन में उन लोगों के माध्यम से पुन: उपयोग करते हैं, तो product_id से मेल खाने वाले आइटमों से बाहर निकलने पर आप वस्तुओं को बाहर निकालने में काफी समय बर्बाद कर देंगे? यदि ऐसा है, तो आपको एक और दृश्य लिखने पर विचार करना चाहिए जिसे प्राथमिक रूप से product_id द्वारा क्रमबद्ध किया गया है। यदि नहीं, तो आगे बढ़ें और खरपतवार दृष्टिकोण का उपयोग करें।

-1

कैसे इस समाधान के बारे में:

  1. मैं सूचकांक के रूप में logtime साथ प्रत्येक उत्पाद के लिए एक दृश्य पैदा करते हैं।
  2. पहुँच प्रत्येक दृश्य के यदि आवश्यक हो और रेंज का उपयोग कर theresults को फ़िल्टर - [fromdate todate]
  3. इनपुट पैरामीटर में प्रत्येक उत्पाद के लिए 3 करो और परिणाम

यह एक दोष यह है कि मुक़ाबला हर उत्पाद के लिए हम एक दृश्य बनाना होगा और यह एक मैन्युअल प्रक्रिया की तरह दिखता है।

बस एक विचार! मुझे अपने विचार बताएं।

+0

यह उससे आसान हो सकता है।बस अपने कुंजी ऑर्डर को उलट दें ताकि दस्तावेजों को पहले उत्पाद द्वारा सॉर्ट किया जा सके, फिर लॉगटाइम द्वारा। वही दृश्य तीन बार पूछें, जो आप चाहते हैं उस समय के प्रत्येक उत्पाद की तलाश में। मेरे द्वारा सबमिट किए गए उत्तर में यह दूसरा सुझाव है, इसलिए यदि आप इसे पसंद करते हैं तो कृपया इसे स्वीकार्य के रूप में चिह्नित करें :) –

+0

हैलो, मुझे "समय सीमा में प्रत्येक उत्पाद को कैसे देखना चाहिए"? मुझे लगता है कि यह वही सवाल है जिसे मैंने पूछा था। तथ्य यह है कि हम केवल एक तिथि या सीमा [स्टार्टडेट एंडडेट] को एक दृश्य में भेज सकते हैं। लेकिन हम एक ही समय में रेंज और उत्पाद आईडी दोनों नहीं भेज सकते हैं। मैं सूचियों का उपयोग करने पर विचार कर रहा हूं जो किसी भी क्वेरी पैरामीटर को स्वीकार करते हैं। एक अद्यतन दे देंगे। धन्यवाद! –

+0

आप एक ही समय में सीमा और उत्पाद आईडी की तलाश कर सकते हैं। कॉच डीबी विचार समग्र कुंजी का उपयोग कर सकते हैं, और आपने एक उदाहरण कैसे बनाया है इसका एक उदाहरण दिया। आपको बस इतना करना है कि आप अपनी कुंजी के क्रम को उलट दें ताकि यह '[doc.product_id, doc.logtime]' हो। इसे पूछने के लिए, आपके द्वारा लिंक किए गए दस्तावेज़ों के अनुसार, उसी दो-आइटम प्रारूप में स्टार्टकी और एंडकी का उपयोग करें। –