2012-03-13 23 views
23

पर छानने मैं मेरे विचार समारोह में इस राशि:CouchDB खोज या कुंजी सरणी

emit([doc.address.country,doc.address.state, doc.address.city], doc); 

जब मैं खोज क्वेरी, मैं में भरा सरणी के सभी 3 तत्वों की आवश्यकता है, उदाहरण के लिए:

?key=["US","NY","New York"] 

कि मेरे रिकॉर्ड उत्पादन होगा, लेकिन सुविधा देता है, उदाहरण के लिए कहते हैं, मैं सिर्फ उदाहरण के लिए अमेरिका में सब कुछ वापस करना चाहते:

?key=["US"] 

या अमेरिका और राज्य में ...

?key=["US","NY"] 

या ... की सुविधा देता है शायद कहते हैं कि मैं न्यूयॉर्क से सिर्फ सभी रिकॉर्ड चाहते हैं ... (मुझे पता नीचे काम नहीं करता है)

?key=["","NY"] 

यदि आप सरणी के तत्वों में से किसी एक को खाली छोड़ना चाहते हैं तो मुझे वास्तव में खोजना नहीं है?

उत्तर

42

पहले:

कुंजी = [ "अमेरिका"] किसी सरणी पर काम नहीं करेगा कुंजी [ "अमेरिका", "न्यूयॉर्क"], आप एक कुंजी सटीक है कि [ "अमेरिका के लिए देख रहे कारण "]। इसके बजाय, आप तो

startkey=["US"]&endkey=["US",{}] 

उपयोग करने के लिए उन कुंजी resultset में कर रहे हैं:

["DE","Bavaria","Munich"] <---- NO ! "DE" is out of Range of startkey 
["US","FL","Miami"]   <---- YES, starts with "US" 
["US","NY","New York"]  <---- YES, starts with "US" 
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey 

भी कार्य करना:

startkey=["US","FL"]&endkey=["US","FL",{}] 

परिणाम:

["DE","Bavaria","Munich"] <---- NO ! "DE" is out of Range of startkey 
["US","FL","Miami"]   <---- YES, starts with "US","FL" 
["US","NY","New York"]  <---- NO, "US","NY" is out of Range of endkey 
["VE","XX","Vencuela City"] <---- NO ! "VE" is out of Range of endkey 

दूसरा: आप बाईं ओर रिक्त स्थान नहीं हो सकता .. तो आप कुछ और अधिक का उत्सर्जन करता है लिखने के लिए है:

दृश्य (आप, दूसरे और तीसरे सरणी-आइटम फेंकना अगर आप इसे क्वेरी करने के लिए की जरूरत नहीं है नहीं है) "byStateCityCountry":

emit([doc.address.state, doc.address.city,address.country], doc); 

दृश्य "byCityStateCountry":

emit([address.city,doc.address.state, doc.address.country], doc); 
सिर्फ पहली जगह में एक झंडा डाल क्वेरी के प्रकार का निर्धारण करने के लिए है, तो आप एक दृश्य में सभी कर सकते हैं की

:

emit([1,address.country,doc.address.state, doc.address.city], doc); 
emit([2,doc.address.state, doc.address.city,address.country], doc); 
emit([3,address.city,doc.address.state, doc.address.country], doc); 

उपयोग:

?startkey=[1,"US"]&endkey=[1,"US",{}] 
?startkey=[2,"FL"]&endkey=[2,"FL",{}] 
?startkey=[3,"Miami"]&endkey=[3,"Miami",{}] 
+0

नोट: "आप बाईं ओर रिक्त स्थान नहीं हो सकता है ..." - मेरा मानना ​​है कि विपरीत सच है अगर आप उतरते है = true – Matt

+2

मैं जानता हूँ कि इस पुरानी है, लेकिन यह यह भी ध्यान दिया जाना चाहिए कि यदि आपके कुंजी सरणी में बहुत से तत्व हैं तो यह अधिक जटिल हो जाता है। इन कुंजियों के साथ अपने दृश्य में निम्न डेटा संभालने: 'startkey == [एक, 11] और endkey == [ग, 11]:' ' [एक, 10], [एक, 11] < - स्टार्टकी, [ए, 12], [बी, 10], [बी, 11], [बी, 12], [सी, 10], [सी, 11] <- एंडकी, [सी, 12] ' (स्टार्टकी और एंड कुंजी के बीच में सब कुछ वापस कर दिया जाएगा।)। – AdriVelaz