CouchRest-ドキュメントIDが存在するかどうかを確認します
質問
私はおそらく明らかなDocoでそれを逃したばかりですが、CouchRestを使用してDBにドキュメントが存在するかどうかを確認する方法を解決することはできません。
私は試した db.get(id)
しかし、それは私のアプリケーションに404を投げます、そして、それを試してみる/キャッチしなければならないのはちょっとばかげているようです。
「このIDが存在する場合 - >更新、else-> create」と言う簡単な方法はありますか?
解決
クイックアンサー - いいえ。
基本的に、既存のドキュメントを更新するには改訂番号が必要であり、最初に確認する必要があるため、Couchで保存または更新することはできません。ここで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が構築された裸の金属のRESTCLIENTを使用した単純なケースです。
以前のスタッカーのコメント(['_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