Массовая оптимизация update_or_create в CouchDb с Ruby - PullRequest
1 голос
/ 30 марта 2012

У меня есть следующий метод, который сохраняет или обновляет список объектов json события.Я не смог найти массовую функцию create_or_update для couchdb, мне пришлось запросить каждый объект и посмотреть, существует ли он в базе данных и создать / обновить соответственно.К сожалению, это крайне неэффективно, для обработки 1725 событий требуется 6 минут.Может кто-нибудь предложить лучший дизайн?Это должно быть сделано за пару секунд.Мой couchdb на самом деле является облачной базой данных ssl, и мое приложение размещено на Heroku, которое отличается от приложения на heroku, которое фактически объединено с cloudant.

1 Ответ

1 голос
/ 10 апреля 2012

Вы можете использовать API для массовых документов CouchDB для создания или обновления. Конечно, поскольку вы «летите вслепую» со значениями _rev, компромисс заключается в том, что вы можете создавать конфликты версий. Это не может быть проблемой для вас, или в некоторых случаях это может быть невозможно или крайне редко (в зависимости от вашего приложения). Просто добавьте опцию "all_or_nothing":true в ваше тело POST.

Кроме того, вы можете выполнить массовое создание или обновление в два этапа. Сначала извлеките все версии документов, затем отправьте традиционный запрос _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, чтобы создать новый документ.)

...