2010-06-04 10 views

cevap

47

örnek işlevi in-place diğer veritabanlarında "yerinde" güncellemeler ile aynı değildir. CouchDB hala sadece bir ek mimariyi kullanır; Belge güncelleme işleyicileri hala

Yine güncelleme işleyicileri oldukça kullanışlı ve öğrenme değer, vb yeni doc inceleme oluşturmak.

Akümülatörlü bir belgeye sahip olduğunuzu varsayalım. değerini bir amount parametresi kullanarak belirterek bir belgede bir tamsayıyı tek bir HTTP sorgusuyla biriktirmek istiyorsunuz. Aşağıdaki komutları düşünün:

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

(POST JSON nesnesi sonra, ^, sonu dosyaya D basmayı unutmayın.)

Sonraki birikim için belgeyi onaylamak (my_doc) var:

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

Artık bir amount parametre güncelleme için alanıyla accumulate güncelleme işleyicisi çağırabilirsiniz.

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} 

Bildirimi yeni number değeri 38 olduğu, 23 + 15

+0

_rev değer artışlarını başarılı ve yol olamazdı. –

+0

Kim, sabit. Teşekkürler. – JasonSmith

2

değeri Yukarıdaki örnekte oynarken çok yararlı buldum şeydir. Bir güncelleme işleyicisi yükledikten sonra, güncelleme işleyicinin kendisini güncellemek için bunu kullanabilirsiniz. Güncelleştirme işleyicisi update.json ise Örneğin, aşağıdaki yapabileceğini:

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 içerdiği burada:

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

bir kaç şey dikkat çekicidir. var resp = eval(uneval(doc)) bildirimi doc klonları. Daha fazla information on cloning here var. _revisions alanı genişleyebileceğinden, bu yanıtı silmek, kullanım durumum için anlam ifade ediyor. toJSON(resp) kullanımı yanıtı bir dize olarak geri gönderir, ancak başarılı bir yanıtta _rev değeri yanlış olur. Başarılı bir güncellemenin doğru düzeltmesini almak için yanıt başlığında X-Couch-Update-NewRev'a bakın. Güncelleştirme çok iyi olsa da, bir çatışmada güncellemeler as addressed here