2011-08-08 12 views
10

CouchDB Wiki on PUT operations के अनुसार।थोक प्रति दस्तावेज़ _rev मूल्य के बिना एक CouchDB डेटाबेस अद्यतन थोक?

मौजूदा दस्तावेज़ को अपडेट करने के लिए, आप एक पुट अनुरोध भी जारी करते हैं। इस मामले में, JSON बॉडी में _rev प्रॉपर्टी होनी चाहिए, जो कोचडीबी को पता चलेगा कि संपादन किस संशोधन पर आधारित है। यदि डेटाबेस में वर्तमान में संग्रहीत दस्तावेज़ का संशोधन मेल नहीं खाता है, तो 40 9 संघर्ष त्रुटि लौटा दी जाती है।

मेरा लक्ष्य एक bulk_docs अद्यतन प्रदर्शन करने के लिए है:

curl -X POST [domain]/[couch db name]/_bulk_docs -H "Content-type: application/json" -d @[some document].json 

मेरे कार्यप्रवाह इस तरह है:

  1. मेरे डेटा एक Google दस्तावेज़ स्प्रैडशीट में है।
  2. मैं Mr. Data Converter
  3. मैं cURL का उपयोग (ऊपर शो के रूप में) में कॉपी करने और चिपकाने से JSON करने के लिए स्प्रेडशीट डेटा परिवर्तित/अद्यतन दस्तावेज

समस्या यह है कि पहली बार मैं नए दस्तावेज़ों को जोड़ने है जोड़ने के लिए, सब कुछ पूरी तरह से काम करता है, हालांकि अगली बार जब मैं एक ही दस्तावेज़ पोस्ट करता हूं, तो मुझे प्रत्येक दस्तावेज़ के लिए निम्न त्रुटि मिलती है:

... {"id": "28", "त्रुटि": "संघर्ष", "कारण ":" दस्तावेज़ अद्यतन संघर्ष। "} ...

क्या _rev संपत्ति सहित किसी भी मौजूदा दस्तावेज़ को अपडेट करने का कोई तरीका है?

उत्तर

18

डिज़ाइन द्वारा, आप एक कॉच डीबी दस्तावेज़ को अंधेरे से अपडेट नहीं कर सकते हैं, आप केवल दस्तावेज़ के विशिष्ट संशोधन को अपडेट करने का प्रयास कर सकते हैं।

एक ही दस्तावेज़ के लिए, आप क्लाइंट से इसे छिपाने के लिए CouchDB update handler का उपयोग कर सकते हैं क्योंकि एक अद्यतन हैंडलर मौजूदा दस्तावेज़ (यदि यह मौजूद है) को इसके संशोधन सहित पारित किया जाएगा।

दस्तावेजों, का एक संग्रह के लिए जब _bulk_docs उपयोग कर, आप "new_edits": false जो जबरन अस्वीकृति के बजाय संघर्ष (सम्मिलित करेंगे जोड़ सकते हैं लेकिन आप अभी भी एक _rev उत्तीर्ण करनी होगी, यह सिर्फ वर्तमान होने की जरूरत नहीं है एक)।

जो कुछ भी कहा गया है, नियमों का पालन करना बेहतर होगा। उस दस्तावेज़ के वर्तमान संशोधन को प्राप्त करें जिसे आप अपडेट करना चाहते हैं, इसे अपडेट करने का प्रयास करें, अगर आपको 40 9 मिलते हैं, नया संस्करण प्राप्त करें, उचित के रूप में विलय करें, और फिर अपडेट करें।

+0

अद्यतन हैंडलर डेटा अपडेट करने के लिए जाने का तरीका प्रतीत होता है। यह तेज़ होगा क्योंकि आपको प्रत्येक दस्तावेज़ को डाउनलोड करने, क्लाइंट पक्ष को मर्ज करने और इसे फिर से अपलोड करने की आवश्यकता नहीं है। इसके बजाय अपडेट हैंडलर आपके लिए नेटवर्क गतिविधि के 1/3 के साथ विलय कर सकता है! –

+0

@ डॉब्सवंडर्मियर जो सार्वभौमिक नहीं है। चूंकि अद्यतन हैंडलर बैच ऑप्स का समर्थन नहीं करता है, यह प्रति अद्यतन/जारी रखने का एक अनुरोध है। यदि आपको एक साथ 2-4 से अधिक करने की आवश्यकता है, तो बैच ऑपरेशंस करें क्योंकि आमतौर पर परिस्थितियों के आधार पर 2-4 अनुरोध लेते हैं उदाहरण के लिए 10 दस्तावेज़ अपडेट करें। बेशक यदि आप 'new_edits" का उपयोग करते हैं: झूठी' आप बैच को 1 अनुरोध में जारी/प्रतिस्थापित कर सकते हैं, लेकिन जागरूक रहें, कि 'new_edits' [प्रतिलिपि द्वारा उपयोग किए जाने का इरादा है] (http://goo.gl/EFFofn)।एक दोष यह है कि यह संशोधन इतिहास को संरक्षित नहीं करता है, मुझे आश्चर्य है कि क्या यह प्रतिकृति के साथ हस्तक्षेप कर सकता है ... –

+0

@DominykasMostauskis आह हाँ, अच्छा बिंदु। ओपी बैच डाउनलोड करना, नए मानों की गणना करना और बैच अपलोड करना चाहता है जो समग्र रूप से कम लेनदेन है। जब तक यह सब स्मृति में फिट बैठता है। –

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