Добавить свойство в CouchDB

Я настроил базу данных couchdb для использования с приложением ruby on rails, используя couchrest.

Теперь в базе данных около 100 тысяч записей, и я хочу добавить поле для хранения метки времени в целочисленном формате.
Попытка обновить его в цикле приводит к тайм-ауту запроса.

Каков наилучший способ добавить новое поле/свойство в CouchDB?

Код

pages = Page.all
pages.each do |p|
  p.update_attributes(:created_at_to_i => p.created_at.to_i)
  puts p.created_at_to_i.inspect
end

Отследить

>> Page.update_timestamp
RestClient::RequestTimeout: Request Timeout
    from /usr/local/lib/ruby/gems/1.8/gems/rest-client-1.6.7/lib/restclient/request.rb:184:in `transmit'
    from /usr/local/lib/ruby/gems/1.8/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute'
    from /usr/local/lib/ruby/gems/1.8/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest-1.1.2/lib/couchrest/rest_api.rb:89:in `execute'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest-1.1.2/lib/couchrest/rest_api.rb:45:in `get'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest-1.1.2/lib/couchrest/database.rb:260:in `view'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest-1.1.2/lib/couchrest/design.rb:52:in `view_on'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest_model-1.1.2/lib/couchrest/model/views.rb:142:in `fetch_view'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest_model-1.1.2/lib/couchrest/model/views.rb:135:in `fetch_view_with_docs'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest_model-1.1.2/lib/couchrest/model/views.rb:104:in `view'
    from /usr/local/lib/ruby/gems/1.8/gems/couchrest_model-1.1.2/lib/couchrest/model/document_queries.rb:12:in `all'
    from /var/www/monitoring_couch/app/models/page.rb:309:in `update_timestamp'
    from (irb):2

person Pravin    schedule 18.11.2011    source источник


Ответы (1)


Чтобы добавить новое свойство, вам нужно загрузить каждый документ, изменить его и сохранить обратно в базу данных. Вы можете сделать это с помощью api массового обновления, но я думаю, что всего за 100 тыс. дополнительные хлопоты.

Пожалуйста, опубликуйте свой сценарий обновления и трассировку, которую вы получите, когда произойдет тайм-аут.

person Andrew Wilkinson    schedule 18.11.2011