Couchrest - Проверка, есть ли идентификатор документа

StackOverflow https://stackoverflow.com/questions/4505743

  •  12-10-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

По сути, невозможно сохранить или обновить на диване, поскольку обновление существующего документа требует номер ревизии, и вам нужно будет получить его первым, чтобы увидеть. Вам нужно будет справиться с 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

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

Другие советы

Я предлагаю использовать couchdb Обновление 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'];
      }
    }"
  }
}

Отправить тогда $DB/_design/$DESIGN_NAME/_update/in_place или поставить на $DB/_design/$DESIGN_NAME/_update/in_place/$DOC_ID. Анкет Это простой случай с использованием RestClient Bare-Metal, на котором был построен Couchrest.

Полностью рабочая функция на основе предыдущего комментария на укладке (я добавляю ['_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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top