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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top