Ruby CouchRest-检查文档id是否存在
我可能只是在doco中遗漏了它,但我不知道如何使用CouchRest检查数据库中是否存在文档 我尝试了Ruby CouchRest-检查文档id是否存在,ruby,couchdb,couchrest,Ruby,Couchdb,Couchrest,我可能只是在doco中遗漏了它,但我不知道如何使用CouchRest检查数据库中是否存在文档 我尝试了db.get(id),但这在我的应用程序中抛出了一个404,而不得不尝试/抓住它似乎有点愚蠢 是否有一种简单的方式来表示“如果此ID存在->更新,否则->创建”快速回答-否 基本上,不可能在coach中保存或更新,因为更新现有文档需要修订号,您需要先获取修订号才能查看。您需要在这里处理404 为了更有帮助,我可能会使用以下方法: def save_or_create(db, doc) beg
db.get(id)
,但这在我的应用程序中抛出了一个404,而不得不尝试/抓住它似乎有点愚蠢
是否有一种简单的方式来表示“如果此ID存在->更新,否则->创建”快速回答-否
基本上,不可能在coach中保存或更新,因为更新现有文档需要修订号,您需要先获取修订号才能查看。您需要在这里处理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
未测试,但应关闭。基于先前堆垛机注释的功能完全正常(我在查询中添加了[''u rev']: 当您的问题是关于创建或更新时,我建议使用couchdb(>=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/\u design/$design\u NAME/\u update/in\u place
或发布到$DB/\u design/$design\u NAME/\u update/in\u place/$DOC\u ID
。这是一个使用裸机RestClient的简单案例,CouchRequest就是基于此构建的
{
"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'];
}
}"
}
}