我可能只是在明显的doco中错过了它,但我无法弄清楚如何使用CouchRest检查我的数据库中是否存在doc。
我尝试了db.get(id)
,但在我的应用程序中抛出了404,并且尝试/抓住它的方式似乎有点愚蠢。
是否有一种简单的方法可以说“如果此ID存在 - >更新,否则 - >创建”?
答案 0 :(得分:2)
快速回答 - 没有。
基本上,无法在沙发中保存或更新,因为更新现有文档需要修订版号,您需要先查看它。你需要在这里处理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
未经测试,但应该关闭。
答案 1 :(得分:2)
当您的问题与创建或更新有关时,我建议使用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 :(得分:0)
基于先前堆栈器注释的完全工作功能(我添加['_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