La funzione di esempio in-place
non è lo stesso di aggiornamenti "in-place" in altre database. CouchDB utilizza ancora un'architettura solo append; gli aggiornamenti del documento gestiscono ancora una nuova revisione del documento, ecc.
Ancora, i gestori di aggiornamento sono abbastanza convenienti e meritano di essere appresi.
Supponiamo di avere un documento con un accumulatore. Si si desidera accumulare un numero intero in un documento con una sola query HTTP, specificando l'importo dell'incremento utilizzando un parametro amount
. Prendere in considerazione 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 che l'oggetto JSON nel post.)
Avanti 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 è possibile chiamare il gestore accumulate
aggiornamento con una amount
parametro 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-<whatever>",
# "number":38}
Si noti che il nuovo valore number
è 38, il valore di 23 + 15.
Il valore _rev incrementa tuttavia sugli aggiornamenti. –
Whoops, risolto. Grazie. – JasonSmith