Gestori dell’aggiornamento del documento CouchDB (aggiornamenti sul posto)

http://wiki.apache.org/couchdb/Document_Update_Handlers

CouchDB (0.10 e versioni successive) supporta ora gli aggiornamenti sul posto. Ho difficoltà a capire come funziona. Ho provato a utilizzare l’esempio fornito ma non riuscivo a farlo funzionare.

Qualcuno può fornire alcuni esempi e uris utilizzati per accedere agli aggiornamenti sul posto.

Grazie

La funzione di esempio in-place non è uguale agli aggiornamenti “sul posto” in altri database. CouchDB utilizza ancora un’architettura solo append; i gestori di aggiornamento dei documenti creano ancora una nuova revisione del documento, ecc.

Tuttavia, i gestori di aggiornamento sono abbastanza convenienti e meritano di essere appresi.

Supponiamo di avere un documento con un accumulatore. Si desidera accumulare un numero intero in un documento con una sola query HTTP, specificando l’importo dell’incremento utilizzando un parametro amount . Considera i seguenti comandi:

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

(Ricordarsi di premere end-of-file, ^ D, dopo l’object JSON nel POST.)

Successivamente confermare il documento per l’accumulo ( my_doc ) esiste:

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

Ora è ansible chiamare il gestore di aggiornamento accumulate con un parametro amount per aggiornare il campo.

 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-", # "number":38} 

Si noti che il nuovo valore number è 38, il valore di 23 + 15.

Ecco qualcosa che ho trovato molto utile quando si gioca con l’esempio sopra. Una volta installato un gestore di aggiornamento, è ansible utilizzarlo per aggiornare lo stesso gestore di aggiornamento. Ad esempio, se il gestore dell’aggiornamento si trova in update.json, puoi eseguire le seguenti operazioni:

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

dove update.json contiene:

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

Alcune cose sono degne di nota. La dichiarazione var resp = eval(uneval(doc)) cloni doc . Ci sono ulteriori informazioni sulla clonazione qui . Dal momento che il campo _revisions può diventare grande, eliminarlo nella risposta ha senso per il mio caso d’uso. L’uso di toJSON(resp) rimanda la risposta come una stringa, tuttavia, il valore di _rev in una risposta corretta sarà errato. Per ottenere la corretta revisione di un aggiornamento riuscito, consultare X-Couch-Update-NewRev nell’intestazione della risposta. L’aggiornamento potrebbe benissimo non riuscire e provocare un conflitto, come indicato qui