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"?

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top