1

イベントjsonオブジェクトのリストを保存または更新する次のメソッドがあります。couchdb の一括 create_or_update 関数が見つかりませんでした。各オブジェクトをクエリして、データベースに存在するかどうかを確認し、それに応じて作成/更新する必要がありました。残念ながら、これは非常に非効率的です。1725 個のイベントを処理するのに 6 分かかります。誰かがより良いデザインを提案できますか? 数秒で完了する必要があります。私のcouchdbは実際にはssl cloudantデータベースであり、私のアプリはHerokuでホストされています。これは、実際にcloudantと組み合わされているherokuのアプリとは異なります。

def self.store(bulk, resource) 
            JSON::Validator.validate!(SCHEMA, bulk, :list => true)
            bulk.each{ |event|
                response = resource.get("/database-dev/_design/Event/_view/byEID?key=\"#{event['eid']}\"")
                if (response["rows"].nil? || response["rows"].empty?) then
                    o =  [('a'..'z'),('A'..'Z'),(0..9)].map{|i| i.to_a}.flatten  
                    o.push('-','_')
                    event['_id']  =  (0..50).map{ o[rand(o.length)]  }.join
                    event['resource'] = 'Event'
                    resource.post('/database-dev', event.to_json)
                else
                    resource.put("/database-dev/#{response['rows'][0]['id']}", event.to_json)   
                end
            }
        end 
4

1 に答える 1

1

CouchDB バルク ドキュメント APIを使用して作成または更新できます。もちろん、_rev値を「盲目的に飛んでいる」ため、リビジョンの競合が発生する可能性があるというトレードオフがあります。それはあなたにとって問題ではないかもしれませんし、場合によっては (アプリケーションによっては) 不可能または非常にまれかもしれません. "all_or_nothing":trueオプションを POST 本文に追加するだけです。

または、2 回の往復で一括作成または更新を行うこともできます。最初にすべてのドキュメントのリビジョンを取得してから、すべての値が設定された従来の_bulk_docsリクエストを送信します。_rev

POST /database-dev/_all_docs
Content-Type: application/json

{"keys": ["id_1", "id_2", "bad_id"]}

HTTP/1.1 200 OK
...couch headers...

{"total_rows":10,"offset":0,"rows":[
  {"id":"id_1","key":"id_1","value":{"rev":"1-6919deb28bdb1d4cf5b53188be5683be"}},
  {"id":"id_2","key":"id_2","value":{"rev":"1-37bb8117bc6c7b182ca26aae16717408"}},
  {"key":"bad_id", "error":"not_found"}
]}

(ビューをリクエストするときも同じことができます。)

_revこれで、_bulk_docs で送信するすべての値がわかります。("rev"値がある場合はそれを使用し、そうでない場合は_rev除外して新しいドキュメントを作成します。)

于 2012-04-10T09:33:13.003 に答える