CouchRest - Überprüfung, ob Dokument-ID vorhanden ist
Frage
habe ich wahrscheinlich nur um es in der Hand doco verpaßt, aber ich kann nicht herausfinden, wie zu überprüfen, ob ein Dokument in meinem db existiert mit CouchRest.
habe ich versucht, db.get(id)
aber das wirft ein 404 in meiner Anwendung, und es scheint irgendwie albern um es auf meine Art zu haben, um zu versuchen / zu fangen.
Gibt es eine einfache Art und Weise zu sagen, "wenn diese ID existiert -> Update, sonst -> erstellen"?
Lösung
Schnelle Antwort - Nr.
Im Grunde ist es nicht möglich, in der Couch zu speichern oder zu aktualisieren, die Aktualisierung ein vorhandenes Dokument die Revisionsnummer erforderlich, und Sie müssen dafür zu sorgen, zuerst lernen. Sie müssen die 404 hier behandeln.
hilfreicher sein, würde ich wahrscheinlich eine Methode wie diese verwendet:
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
Nicht getestet, aber sollte in der Nähe sein.
Andere Tipps
Ich schlage vor, mit couchdb Update API (> = 0.10), wenn Ihr Problem über CREATE- ist oder-Update. Design es nur etwa so:
{
"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 dann $DB/_design/$DESIGN_NAME/_update/in_place
oder PUT $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID
. Es ist ein einfacher Fall Bare-Metal RestClient verwenden, auf die CouchRest gebaut wurde.
Vollfunktion arbeitet auf der Grundlage früheren Stapler Kommentar (i hinzufügen [ '_rev'] zu Abfrage):
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