CouchRest - controllare se il documento esiste id
Domanda
Ho probabilmente appena perso in evidente doco ma non riesco a capire come controllare se un documento esiste nel mio db utilizzando CouchRest.
Ho provato db.get(id)
ma che getta una 404 nella mia richiesta, e sembra tipo di sciocco dover try / catch il mio modo intorno ad esso.
C'è un modo semplice per dire "se esiste questo ID -> aggiornamento, il resto -> creare"?
Soluzione
Risposta rapida -. No
In sostanza, non è possibile salvare o aggiornare nel divano, come l'aggiornamento di un documento esistente richiesto il numero di revisione, e sarà necessario per arrivare prima a vedere. Sarà necessario per gestire il 404 qui.
Per essere più utile, probabilmente sarei utilizzare un metodo come questo:
def save_or_create(db, doc)
begin
rev = db.get(doc['_id'])
doc['_rev'] = rev
db.save_doc(doc)
rescue RestClient::ResourceNotFound => nfe
db.save_doc(doc)
end
end
Non testato, ma dovrebbe essere vicino.
Altri suggerimenti
Io suggerisco di usare CouchDB aggiornamento API (> = 0.10), quando il problema è di circa Create- o aggiornamento. Progettare è proprio in questo modo:
{
"updates" : {
"in_place" : "function(doc, req) {
var new_doc = null;
if (req.body) {
new_doc = JSON.parse(req.body);
} else {
return [null, 'No doc given!'];
}
if (doc) {
for(var attr in new_doc) {
if (attr != '_id' && attr != '_rev') {
doc[attr] = new_doc[attr];
}
}
return [doc, 'Update OK'];
} else {
new_doc['_id'] = new_doc['_id'] || req.uuid;
return [new_doc, 'Insert OK'];
}
}"
}
}
POST poi $DB/_design/$DESIGN_NAME/_update/in_place
o mettere a $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID
. Si tratta di un caso semplice utilizzando bare-metal RestClient, su cui è stata costruita CouchRest.
funzione completamente funzionante sulla base di precedenti commenti stacker (aggiungo [ '_rev'] per query):
def save_or_create(db, doc)
begin
rev = db.get(doc['_id'])['_rev']
doc['_rev'] = rev
db.save_doc(doc)
rescue RestClient::ResourceNotFound => nfe
db.save_doc(doc)
end
end