Couchrest - Проверка, есть ли идентификатор документа
Вопрос
Я, наверное, просто пропустил это в очевидном документе, но я не могу понять, как проверить, существует ли док в моем БД с помощью 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