2010-06-04 35 views
29

http://wiki.apache.org/couchdb/Document_Update_HandlersTrình xử lý cập nhật tài liệu CouchDB (bản cập nhật tại chỗ)

CouchDB (0.10 trở lên) hỗ trợ cập nhật tại chỗ ngay bây giờ. Tôi đang gặp sự cố khi hiểu cách hoạt động của nó. Tôi đã cố gắng sử dụng ví dụ được cung cấp nhưng tôi không thể làm cho nó hoạt động.

Ai đó có thể cung cấp một số ví dụ và uris được sử dụng để truy cập các bản cập nhật tại chỗ.

Cảm ơn

Trả lời

47

Ví dụ chức năng in-place là không giống như "tại chỗ" cập nhật trong cơ sở dữ liệu khác. CouchDB vẫn sử dụng kiến ​​trúc phụ thêm; tài liệu cập nhật trình xử lý vẫn tạo bản sửa đổi tài liệu mới, v.v.

Tuy nhiên, trình xử lý cập nhật khá thuận tiện và đáng học.

Giả sử bạn có tài liệu có bộ tích lũy. Bạn muốn tích lũy số nguyên trong tài liệu chỉ với một truy vấn HTTP, chỉ định số tiền gia tăng sử dụng thông số amount. Hãy xem xét các lệnh sau:

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"}] 

(Hãy nhớ nhấn end-of-file,^D, sau khi đối tượng JSON trong POST.)

Tiếp theo xác nhận tài liệu để tích lũy (my_doc) tồn tại:

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

Bây giờ bạn có thể gọi handler accumulate cập nhật với một amount tham số để cập nhật lĩnh vực này.

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} 

Chú ý rằng giá trị mới number là 38, giá trị của 23 + 15.

+0

Giá trị _rev tăng trên các bản cập nhật. –

+0

Rất tiếc, đã được sửa. Cảm ơn. – JasonSmith

2

Dưới đây là một cái gì đó tôi thấy rất hữu ích khi chơi với ví dụ trên. Khi bạn đã cài đặt trình xử lý cập nhật, bạn có thể sử dụng trình xử lý cập nhật để tự cập nhật trình xử lý cập nhật. Ví dụ, nếu xử lý cập nhật của bạn là trong update.json, bạn có thể làm như sau:

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

nơi update.json chứa:

{"_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)]; }" 
    } 
} 

Một vài điều rất đáng chú ý. Tuyên bố var resp = eval(uneval(doc)) nhái doc. Có nhiều hơn information on cloning here. Vì trường _revisions có thể lớn, việc xóa nó trong phản hồi có ý nghĩa đối với trường hợp sử dụng của tôi. Tuy nhiên, việc sử dụng toJSON(resp) gửi trả lời dưới dạng chuỗi, giá trị của _rev trong phản hồi thành công sẽ sai. Để có được bản sửa đổi chính xác của bản cập nhật thành công, hãy xem X-Couch-Update-NewRev trong tiêu đề phản hồi. Bản cập nhật có thể không thành công và dẫn đến xung đột, as addressed here

Các vấn đề liên quan