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

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top