2010-04-06 10 views
10

मैं सोफे डीबी में "शीर्ष 10 का चयन करें" के समतुल्य क्वेरी कैसे निष्पादित करूं?couchdb में शीर्ष/नवीनतम 10 का चयन करें?

उदाहरण के लिए मैं बहुत की तरह एक "स्कीमा" है:

title body modified 

और मैं पिछले 10 संशोधित दस्तावेज़ों का चयन करना चाहते हैं।

कोई अतिरिक्त बोनस के रूप में यदि कोई भी केवल एक ही श्रेणी में ऐसा करने के लिए आ सकता है। तो इसके लिए:

title category body modified 

प्रत्येक श्रेणी में नवीनतम 10 दस्तावेज़ों की एक सूची लौटाएं।

मैं सोच रहा हूं कि सोफेडब में ऐसी क्वेरी संभव है या नहीं।

+0

क्या कोई कारण है कि आप इसे मैन्युअल रूप से नहीं करना चाहते हैं? उपलब्ध श्रेणियों के लिए पहली क्वेरी, फिर प्रति श्रेणी सूचियों से पूछें। बैच की गई दूसरी क्वेरी करना, यह लगभग क्वेरी पर है। –

+0

मैं इसे हां कर सकता हूं - लेकिन मेरा सवाल यह है कि क्या इस तरह की कुछ चीज़ सोफेडब में संभव है, एक प्रश्न में। उदाहरण के लिए कोई वास्तव में घुलनशील जटिल नेस्टेड चयन कथन के साथ एसक्यूएल में ऐसा कर सकता है। – drozzy

उत्तर

3
यहाँ

आप क्या करने की जरूरत है।

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

function(doc) 
{ 
    if (doc.category) 
    { 
    emit(['category', doc.category], doc.modified); 
    } 
} 

फिर आपको एक सूची समारोह है कि उन्हें समूहों में, आप एक कम करने और ऐसा करने के दुरुपयोग temped किया जा सकता है की जरूरत है, लेकिन यह शायद इसलिए है क्योंकि बड़े सेट के साथ काफी तेजी से कम करने नहीं की त्रुटियों फेंक होगा आंकड़े का।

function(head, req) 
{ 
    % this sort function assumes that modifed is a number 
    % and it sorts in descending order 
    function sortCategory(a,b) { b.value - a.value; } 
    var categories = {}; 
    var category; 
    var id; 
    var row; 
    while (row = getRow()) 
    { 
    if (!categories[row.key[0]]) 
    { 
     categories[row.key[0]] = []; 
    } 
    categories[row.key[0]].push(row); 
    } 
    for (var cat in categories) 
    { 
    categories[cat].sort(sortCategory); 
    categories[cat] = categories[cat].slice(0,10); 
    } 
    send(toJSON(categories)); 
} 

आप सभी श्रेणियों 10 अब ऊपर प्राप्त कर सकते हैं

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories 

साथ और

http://localhost:5984/database/_design/doc/_list/top_ten/by_categories?include_docs=true 

के साथ डॉक्स मिल अब आप एक से अधिक रेंज पोस्ट और सीमा जो श्रेणियों

के साथ इस क्वेरी कर सकता है
curl -X POST http://localhost:5984/database/_design/doc/_list/top_ten/by_categories -d '{"keys":[["category1"],["category2",["category3"]]}' 

आप 10 को हार्ड कोड भी नहीं दे सकते हैं और req चर के माध्यम से संख्या को पास कर सकते हैं।

यहां कुछ और देखें/सूची trickery है।

+0

कूल, मैं इसका परीक्षण करूँगा और आपको वापस ले जाऊंगा! – drozzy

+0

मैंने इस जवाब का परीक्षण नहीं किया, लेकिन मैं इसे किसी भी तरह स्वीकार करूँगा क्योंकि मैं अब सोफेडब के साथ काम नहीं करता हूं। – drozzy

7

अपने डीबी से पहले 10 दस्तावेज़ प्राप्त करने के लिए आप सीमा क्वेरी विकल्प का उपयोग कर सकते हैं। ईजी। कॉलिंग

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?limit=10 

आपको पहले 10 दस्तावेज़ मिलते हैं।

देखें पंक्तियों को कुंजी द्वारा क्रमबद्ध किया गया है; क्वेरीस्ट्रिंग में descending = true जोड़ने से उनके ऑर्डर को उलट दिया जाएगा। आप रुचि रखने वाली कुंजियों का चयन करने के लिए केवल क्वेरीस्ट्रिंग का उपयोग करके रुचि रखने वाले दस्तावेज़ों को भी उत्सर्जित कर सकते हैं। तो अपने ध्यान में रखते हुए आप की तरह अपने नक्शे समारोह लिखें:

function(doc) { 
    emit([doc.category, doc.modified], doc); 
} 

और आप इसे इस तरह क्वेरी:

http://localhost:5984/yourdb/_design/design_doc/_view/view_name?startkey=["youcategory"]&endkey=["youcategory", date_in_the_future]&limit=10&descending=true 
+0

क्या वह दूसरी क्वेरी वास्तव में प्रत्येक श्रेणी में नवीनतम 10 आइटम का चयन करेगी? या सिर्फ एक श्रेणी से नवीनतम 10 आइटम? – drozzy

+0

ओह। मैंने आपके प्रश्न को गलत तरीके से पढ़ाया। यह एक श्रेणी से नवीनतम 10 आइटम का चयन करता है। – filippo

0

मामूली सुधार। यह तब तक सॉर्ट नहीं कर रहा था जब तक मैंने आपके सॉर्ट श्रेणी समारोह में "वापसी" कीवर्ड जोड़ा।यह इस तरह होना चाहिए:

function sortCategory(a,b) { return b.value - a.value; } 
संबंधित मुद्दे