2

明らかなドキュメントで見逃した可能性がありますが、CouchRestを使用してドキュメントがデータベースに存在するかどうかを確認する方法を理解できません。

私は試しdb.get(id)ましたが、それは私のアプリケーションに404をスローし、それを回避しようとする/キャッチする必要があるのはちょっとばかげているようです。

「このIDが存在する場合->更新、そうでない場合->作成」と言う簡単な方法はありますか?

4

3 に答える 3

2

クイックアンサー-いいえ。

基本的に、既存のドキュメントを更新するにはリビジョン番号が必要であり、最初に確認する必要があるため、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

テストされていませんが、近いはずです。

于 2010-12-22T03:06:47.400 に答える
2

問題が作成または更新に関するものである場合は、 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'];
      }
    }"
  }
}

にPOSTしてから、$DB/_design/$DESIGN_NAME/_update/in_placeまたはにPUTし$DB/_design/$DESIGN_NAME/_update/in_place/$DOC_IDます。これは、CouchRestが構築されたベアメタルRestClientを使用した単純なケースです。

于 2012-03-18T20:12:47.940 に答える
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
于 2011-01-22T07:03:54.843 に答える