CouchRest - проверка, существует ли идентификатор документа - PullRequest
2 голосов
/ 22 декабря 2010

Я, вероятно, только что пропустил это в очевидном документе, но я не могу понять, как проверить, есть ли документ в моем БД, используя CouchRest.

Я попытался db.get(id), но это выдает 404мое приложение, и мне кажется глупым пытаться / обойти его.

Есть ли простой способ сказать "если этот идентификатор существует -> обновить, еще -> создать"?

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

Я предлагаю использовать couchdb update API (> = 0.10), когда ваша проблема касается создания или обновления. Создай это так:

{
  "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 затем $DB/_design/$DESIGN_NAME/_update/in_place или PUT $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID. Это простой случай с использованием RestClient из чистого металла, на котором был построен CouchRest.

2 голосов
/ 22 декабря 2010

Быстрый ответ - нет.

В принципе, невозможно сохранить или обновить на диване, поскольку обновление существующего документа требовало номера редакции, и вам нужно будет сначала его увидеть.Здесь вам нужно будет обработать 404.

Чтобы быть более полезным, я бы, вероятно, использовал такой метод:

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

Не проверено, но должно быть близко.

0 голосов
/ 22 января 2011

Полностью рабочая функция, основанная на предыдущем комментарии укладчика (я добавляю ['_rev'] к запросу):

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
...