Массовое обновление базы данных CouchDB без значения _rev для каждого документа?

В соответствии с CouchDB Wiki в операциях PUT.

Чтобы обновить существующий документ, вы также выдаете запрос PUT. В этом случае тело JSON должно содержать свойство _rev, которое позволяет CouchDB знать, на какой ревизии исправлены. Если пересмотр документа, хранящегося в настоящее время в базе данных, не соответствует, то возвращается ошибка конфликта 409.

Моя цель - выполнить обновление bulk_docs:

curl -X POST [domain]/[couch db name]/_bulk_docs -H "Content-type: application/json" -d @[some document].json

Мой рабочий процесс выглядит следующим образом:

  • Мои данные находятся в электронной таблице Документов Google.
  • Я преобразую данные таблицы в JSON путем копирования и вставки в Mr. Преобразователь данных
  • Я использую cURL (как показано выше) для добавления/обновления документов.

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

... { "id": "28", "error": "конфликт", "причина": "конфликт обновления документа".}...

Есть ли способ обновить существующий документ без включения свойства _rev?

Ответ 1

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

Для одного документа вы можете использовать обработчик обновления CouchDB, чтобы скрыть это от клиента, поскольку обработчик обновления будет передан существующий документ (если он существует), включая его ревизию.

Для коллекции документов при использовании _bulk_docs вы можете добавить "new_edits": false, который будет принудительно вставлять конфликты вместо отказа (хотя вам все равно нужно передать _rev, это просто не обязательно должно быть текущий).

Все, что сказал, было бы лучше следовать правилам. Возьмите текущую ревизию документа, который вы хотите обновить, попытайтесь его обновить, если вы получите 409, получите новую версию, слейте ее соответствующим образом и снова обновите.