2010-06-04 20 views
29

http://wiki.apache.org/couchdb/Document_Update_HandlersCouchDB दस्तावेज़ अद्यतन हैंडलर (यथा-स्थान अपडेट)

CouchDB (0.10 और ऊपर) में जगह अद्यतन का समर्थन करता है। मुझे यह समझने में परेशानी हो रही है कि यह कैसे काम करता है। मैंने प्रदान किए गए उदाहरण का उपयोग करने की कोशिश की लेकिन मैं इसे काम नहीं कर सका।

क्या कोई इन-प्लेस अपडेट तक पहुंचने के लिए उपयोग किए जाने वाले कुछ उदाहरण और यूरी प्रदान कर सकता है।

धन्यवाद

उत्तर

47

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

फिर भी, हैंडलर अपडेट करना काफी सुविधाजनक और सीखने योग्य है।

मान लें कि आपके पास एक संचयक वाला दस्तावेज़ है। आप किसी दस्तावेज़ में केवल एक HTTP क्वेरी के साथ एक पूर्णांक जमा करना चाहते हैं, amount पैरामीटर का उपयोग करके वृद्धि राशि निर्दिष्ट करना। निम्न कमांड पर विचार करें:

curl -X PUT http://localhost:5984/db 
# Returns {"ok":true} 

curl -H "Content-Type:application/json" -X POST http://localhost:5984/db/_bulk_docs -d @- 
{"docs": 
    [ 
    {"_id": "my_doc", "number": 23}, 
    {"_id": "_design/app", 
     "updates": { 
     "accumulate": "function (doc, req) { 
         var inc_amount = parseInt(req.query.amount); 
         doc.number = doc.number + inc_amount; 
         return [doc, \"I incremented \" + 
             doc._id + \" by \" + 
             inc_amount]; 
         }" 
     } 
    } 
    ] 
} 
# Returns [{"id":"my_doc","rev":"1-8c9c19a45a7e2dac735005bbe301eb15"}, 
#   {"id":"_design/app","rev":"1-83ec85978d1ed32ee741ce767c83d06e"}] 

(प्रेस करने के अंत फ़ाइल,^डी, पोस्ट में JSON ऑब्जेक्ट के बाद याद रखें।)

अगला संचय के लिए दस्तावेज़ की पुष्टि (my_doc) मौजूद है:

curl http://localhost:5984/db/my_doc 
# Returns {"_id":"my_doc","_rev":"1-8c9c19a45a7e2dac735005bbe301eb15", 
#   "number":23} 

अब आप एक amount पैरामीटर अद्यतन करने के लिए क्षेत्र के साथ accumulate अद्यतन हैंडलर कॉल कर सकते हैं।

curl -X PUT \ 
http://localhost:5984/db/_design/app/_update/accumulate/my_doc?amount=15 
# Returns: I incremented my_doc by 15 

curl http://localhost:5984/db/my_doc 
# Returns {"_id":"my_doc","_rev":"2-<whatever>", 
#   "number":38} 

सूचना है कि नए number मूल्य 38 है, 23 + 15.

+0

हालांकि अपडेट पर _rev मान वृद्धि। –

+0

वूप्स, फिक्स्ड। धन्यवाद। – JasonSmith

2

का मूल्य यहाँ कुछ मैं बहुत उपयोगी पाया जब ऊपर के उदाहरण के साथ खेल रहा है। एक बार जब आप एक अद्यतन हैंडलर स्थापित कर लेंगे, तो आप इसे अद्यतन-हैंडलर को अपडेट करने के लिए उपयोग कर सकते हैं। जहां update.json शामिल

curl --dump-header - -H "Content-Type:application/json" -X POST http://localhost:5984/db/_design/app/_update/modifyinplace/_design/app -d @update.json 

: उदाहरण के लिए, यदि आपके अद्यतन हैंडलर update.json में है, तो आप निम्न कर सकता है

{"_id": "_design/app", 
    "updates": { 
     "modifyinplace": "function (doc, req) { var fields = JSON.parse(req.body); for (var i in fields) { doc[i] = fields[i] } var resp = eval(uneval(doc)); delete resp._revisions; return [doc, toJSON(resp)]; }" 
    } 
} 

कुछ बातें उल्लेखनीय हैं। बयान var resp = eval(uneval(doc)) क्लोन docinformation on cloning here है। चूंकि _revisions फ़ील्ड बड़ा हो सकता है, प्रतिक्रिया में इसे हटाने से मेरे उपयोग के मामले में समझ आती है। toJSON(resp) का उपयोग एक स्ट्रिंग के रूप में प्रतिक्रिया वापस भेजता है, हालांकि, सफल प्रतिक्रिया में _rev का मान गलत होगा। सफल अपडेट का सही संशोधन प्राप्त करने के लिए, प्रतिक्रिया शीर्षलेख में X-Couch-Update-NewRev देखें। अद्यतन बहुत सफल नहीं हो सकता है और परिणामस्वरूप संघर्ष हो सकता है, as addressed here

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