Couchrest-检查文档ID是否存在
题
我可能只是在明显的DOCO中错过了它,但是我无法弄清楚如何使用Couchrest检查DOC是否存在。
我试过了 db.get(id)
但这在我的应用程序中抛出了404,必须尝试/抓住我的方式似乎很愚蠢。
有没有简单的方法可以说“如果存在此ID - >更新,否则 - >创建”?
解决方案
快速答案 - 不。
基本上,由于更新现有文档需要修订号,因此不可能保存或更新在沙发中,您将需要先查看它。您需要在这里处理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
. 。这是一个简单的案例,使用裸金属静电剂,在其上建造了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
不隶属于 StackOverflow