2012-05-14 14 views
10

मैं हैच न्यूज प्रदान करता हूं, जिस तरह से कॉच डीबी का उपयोग कर टिप्पणियां प्रदर्शित करने का मूल तरीका लागू करने का प्रयास कर रहा हूं। न केवल पदानुक्रमित आदेश दिया गया है, बल्कि पेड़ के प्रत्येक स्तर को "अंक" चर द्वारा आदेश दिया जाना चाहिए।कॉच डीबी - रैंकिंग के साथ पदानुक्रमित टिप्पणियां। हैकर समाचार शैली

विचार यह है कि मैं इसे छोड़कर क्रम में इसे वापस करने के लिए एक दृश्य चाहता हूं, और उदाहरण के लिए कई अजाक्स कॉल नहीं करता हूं, उन्हें पुनर्प्राप्त करने के लिए और उन्हें सही तरीके से आदेश दिया गया है।

यह मैं अब तक क्या मिला है:

  • प्रत्येक दस्तावेज़ एक "टिप्पणी" है।
  • प्रत्येक टिप्पणी में एक संपत्ति path है जो एक आदेश दिया गया सूची है जिसमें उसके सभी माता-पिता शामिल हैं।

उदाहरण के लिए, कल्पना मैं 4 टिप्पणियां (_ id 1, 2, 3 और 4 साथ) है। टिप्पणी 21 के बच्चे हैं, टिप्पणी 2 के बच्चे हैं, और 41 के बच्चे भी हैं। यह डेटा जैसा दिखता है:

{ _id: 1, path: ["1"] }, 
{ _id: 2, path: ["1", "2"] }, 
{ _id: 3, path: ["1", "2", "3"] } 
{ _id: 4, path: ["1", "4"] } 

यह पदानुक्रम के लिए काफी अच्छा काम करता है। एक साधारण view पहले से ही चीजों को जिस तरह से मैं चाहता हूं उसे वापस कर दूंगा।

समस्या तब आती है जब मैं पेड़ के प्रत्येक "स्तर" को स्वतंत्र रूप से आदेश देना चाहता हूं। तो उदाहरण के लिए दस्तावेज़ 2 और 4 एक ही शाखा से संबंधित हैं, लेकिन उस स्तर पर, उनके आईडी द्वारा आदेश दिया जाता है। इसके बजाय मैं उन्हें "पॉइंट्स" वैरिएबल के आधार पर आदेश देना चाहता हूं जिसे मैं पथ में जोड़ना चाहता हूं - लेकिन यह समझ में नहीं आता है कि मैं इस वैरिएबल को उस तरीके से काम करने के लिए कहां जोड़ सकता हूं जहां मैं चाहता हूं।

क्या ऐसा करने का कोई तरीका है? ध्यान दें कि "अंक" चर समय में बदल जाएगा।

+0

हाय, लुका। क्या आप एक बड़े स्वीप में टिप्पणियां अपडेट करने के इच्छुक हैं? उदाहरण के लिए, हर घंटे, उनकी उम्र बढ़ जाती है? उस प्रश्न का उत्तर समस्या के उत्तर को प्रभावित करता है। धन्यवाद! – JasonSmith

+0

हाय @ जेसनस्मिथ। अभी के लिए हम तारीख की समस्या को भूल सकते हैं। आइए कल्पना करें कि प्रत्येक "टिप्पणी" में 'स्कोर' संपत्ति होती है जिसमें उसके स्कोर का पूर्णांक मान होता है। डिस्प्ले को ऊपर वर्णित अनुसार पदानुक्रम न केवल दिखाने की आवश्यकता होगी, बल्कि इस 'स्कोर' संपत्ति के आधार पर पेड़ के प्रत्येक "स्तर" को भी ऑर्डर करना होगा। यह वह जगह है जहां मुझे समस्याएं आ रही हैं। आप यहां जो उदाहरण प्राप्त करने की कोशिश कर रहे हैं उसका एक उदाहरण यहां देख सकते हैं: http://hckr.iriscou.ch/news/_design/news/_view/items पहला रूट टिप्पणी, और शेष बच्चे और बच्चों के बच्चे हैं । कुंजी में पथ और अंतिम तत्व के रूप में 'स्कोर' मान भी शामिल है। –

+0

हालांकि, जैसा कि आप देख सकते हैं, यह काम नहीं कर रहा है क्योंकि चाबियों का दूसरा अंतिम तत्व वास्तविक दस्तावेज़ का _id है। इसकी आवश्यकता है ताकि मैं अपने बच्चों (पथ तर्क के आधार पर) को अनुलग्न कर सकूं। मुझे लगता है कि इसका मतलब बनता है। किसी भी मामले में, स्कोर को अंतिम मान के रूप में रखते हुए काम नहीं कर रहा है :( –

उत्तर

4

क्योंकि प्रत्येक स्तर से रिकर्सिवली अनुसार क्रमबद्ध करने की आवश्यकता है स्कोर, सोफे को इस काम को जिस तरह से आप चाहते हैं उसे बनाने के लिए प्रत्येक माता-पिता के स्कोर को जानना आवश्यक है।

निम्नलिखित स्कोर के साथ अपने उदाहरण ले रहा है (1: 10, 2: 10, 3: 10, 4:)

इस मामले में आप आदेश निम्नलिखित की तरह बाहर आना चाहते हैं:

.1 
.1.4 
.1.2 
.1.2.3 

आपका दस्तावेज़ इस तरह सरणी एक स्कोर की जरूरत है:

{ _id: 1, path: [1], scores: [10] }, 
{ _id: 2, path: [1, 2], scores: [10,10] }, 
{ _id: 3, path: [1, 2, 3], scores: [10,10,10] }, 
{ _id: 4, path: [1, 4], scores: [10,20] } 

तो you'l मैं आपके दृश्य में निम्न प्रकार की कुंजी का उपयोग करता हूं।

emit([doc.scores, doc.path], doc) 

पथ एक टाईब्रेकर के रूप में इस्तेमाल किया जाता है क्योंकि वहाँ मामलों में जहां भाई टिप्पणी ठीक उसी स्कोर किया जाएगा। टाईब्रेकर के बिना, उनके वंशज अपने समूह (वंश की श्रृंखला द्वारा) खो सकते हैं।

नोट: यह दृष्टिकोण निम्न से उच्च तक स्कोर लौटाएगा, जबकि आप शायद स्कोर (उच्च से कम) और पथ/टिब्रेकर (निम्न से उच्च) चाहते हैं। तो इस के लिए एक समाधान इस तरह प्रत्येक स्कोर का प्रतिलोम के साथ स्कोर की सरणी को भरने के लिए होगा:

{ _id: 1, path: [1], scores: [0.1] }, 
{ _id: 2, path: [1, 2], scores: [0.1,0.1] }, 
{ _id: 3, path: [1, 2, 3], scores: [0.1,0.1,0.1] }, 
{ _id: 4, path: [1, 4], scores: [0.1,0.2] } 

और फिर descending=true का उपयोग करके ऐसी देखने का अनुरोध करें।

+0

यदि आप संख्यात्मक पोस्ट आईडी का उपयोग करने जा रहे हैं, तो आपके पथ में अनगिनत मान होना चाहिए ताकि आपको वर्णमाला सॉर्टिंग व्यवहार (उदाहरण 1, 10, 2, 3, 4, 5, 6, 7, 8, 9) –

+0

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

+0

हां शायद यह सबसे आसान तरीका है। –

2

हो सकता है कि किसी को भी दिलचस्प समाधान के भिन्न रूपों के साथ इस प्रश्न पर धागा:

http://mail-archives.apache.org/mod_mbox/couchdb-dev/201205.mbox/thread -> विषय "श्रेणीबद्ध टिप्पणी हैकर समाचार शैली" 16/05/2012

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