Domanda

Ho probabilmente appena perso in evidente doco ma non riesco a capire come controllare se un documento esiste nel mio db utilizzando CouchRest.

Ho provato db.get(id) ma che getta una 404 nella mia richiesta, e sembra tipo di sciocco dover try / catch il mio modo intorno ad esso.

C'è un modo semplice per dire "se esiste questo ID -> aggiornamento, il resto -> creare"?

È stato utile?

Soluzione

Risposta rapida -. No

In sostanza, non è possibile salvare o aggiornare nel divano, come l'aggiornamento di un documento esistente richiesto il numero di revisione, e sarà necessario per arrivare prima a vedere. Sarà necessario per gestire il 404 qui.

Per essere più utile, probabilmente sarei utilizzare un metodo come questo:

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 testato, ma dovrebbe essere vicino.

Altri suggerimenti

Io suggerisco di usare CouchDB aggiornamento API (> = 0.10), quando il problema è di circa Create- o aggiornamento. Progettare è proprio in questo modo:

{
  "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 poi $DB/_design/$DESIGN_NAME/_update/in_place o mettere a $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID. Si tratta di un caso semplice utilizzando bare-metal RestClient, su cui è stata costruita CouchRest.

funzione completamente funzionante sulla base di precedenti commenti stacker (aggiungo [ '_rev'] per query):

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top