CouchRest - comprobar si existe documento de identidad
Pregunta
he probablemente sólo se perdió en mana obvio, pero no puedo encontrar la manera de comprobar si existe un documento en mi db usando CouchRest.
Me trató db.get(id)
pero que arroja un 404 en mi solicitud, y parece un poco tonto a tener que tratar / recuperar el camino a su alrededor.
¿Hay una forma sencilla de decir "si existe este ID -> actualización, de lo contrario -> crear"?
Solución
Respuesta Rápida -. No
Básicamente, no es posible guardar o actualización en el sofá, como la actualización de un documento existente requiere el número de revisión, y se necesita para conseguirlo primero en ver. Usted tendrá que manejar el 404 aquí.
Para ser más útil, probablemente utilice un método como este:
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
No probado, pero debe estar cerca.
Otros consejos
sugiere emplear couchdb actualización API (> = 0.10) cuando su problema es sobre Create- o actualización. Diseñar sólo de esta manera:
{
"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'];
}
}"
}
}
poner luego a $DB/_design/$DESIGN_NAME/_update/in_place
o PUT a $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID
. Es un caso simple usando RESTClient-metal desnudo, sobre el cual se construyó CouchRest.
Función Totalmente de trabajo basado en comentario anterior apiladora (i añadir [ '_rev'] a consulta):
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