CouchRest - vérifier si id document existe
Question
Je l'ai probablement manqué dans doco évident, mais je ne peux pas travailler comment vérifier si un document existe dans mon db en utilisant CouchRest.
J'ai essayé db.get(id)
mais qui jette un 404 dans ma demande, et il semble un peu ridicule d'avoir à essayer / attraper mon chemin autour.
Y at-il un moyen simple de dire "si cet ID -> mise à jour, sinon -> créer"?
La solution
Réponse rapide -. Pas
En fait, il est impossible d'enregistrer ou de mise à jour dans un canapé, comme la mise à jour d'un document existant requis le numéro de révision, et vous aurez besoin d'obtenir d'abord pour voir. Vous devrez gérer la 404 ici.
Pour être plus utile, je serais probablement utiliser une méthode comme ceci:
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 testé, mais devrait être proche.
Autres conseils
Je suggère d'utiliser CouchDB API mise à jour (> = 0,10) lorsque votre problème est sur le point create- ou mise à jour. Concevoir comme ceci:
{
"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 puis $DB/_design/$DESIGN_NAME/_update/in_place
ou PUT à $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID
. Il est un cas simple en utilisant RESTClient-métal nu, sur lequel CouchRest a été construit.
Fonction de travail entièrement basé sur le commentaire empileur précédent (i ajouter [ '_rev'] à la requête):
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