Обработчики обновления документов CouchDB (обновления на месте) - PullRequest
31 голосов
/ 04 июня 2010

http://wiki.apache.org/couchdb/Document_Update_Handlers

CouchDB (0.10 и выше) теперь поддерживает обновления на месте. У меня проблемы с пониманием, как это работает. Я попытался использовать предоставленный пример, но не смог заставить его работать.

Может ли кто-нибудь предоставить некоторые примеры и uris, используемые для доступа к обновлениям на месте.

Спасибо

Ответы [ 2 ]

49 голосов
/ 05 июня 2010

Пример функции in-place отличается от «обновлений на месте» в других базы данных. CouchDB все еще использует архитектуру только для добавления; обновление документа обработчики по-прежнему создают новую версию документа и т. д.

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

Предположим, у вас есть документ с аккумулятором. Вы хотите накапливать целое число в документе одним HTTP-запросом, указав величина приращения с использованием параметра amount. Рассмотрим следующие команды:

curl -X PUT http://localhost:5984/db
# Returns {"ok":true}

curl -H "Content-Type:application/json" -X POST http://localhost:5984/db/_bulk_docs -d @-
{"docs":
  [
    {"_id": "my_doc", "number": 23},
    {"_id": "_design/app",
      "updates": {
        "accumulate": "function (doc, req) {
                         var inc_amount = parseInt(req.query.amount);
                         doc.number = doc.number + inc_amount;
                         return [doc, \"I incremented \" +
                                      doc._id + \" by \" +
                                      inc_amount];
                       }"
      }
    }
  ]
}
# Returns [{"id":"my_doc","rev":"1-8c9c19a45a7e2dac735005bbe301eb15"},
#          {"id":"_design/app","rev":"1-83ec85978d1ed32ee741ce767c83d06e"}]

(Не забудьте нажать конец файла, ^ D, после объекта JSON в POST.)

Далее подтвердите, что документ для накопления (my_doc) существует:

curl http://localhost:5984/db/my_doc
# Returns {"_id":"my_doc","_rev":"1-8c9c19a45a7e2dac735005bbe301eb15",
#          "number":23}

Теперь вы можете вызвать обработчик обновления accumulate с параметром amount, чтобы обновить поле.

curl -X PUT \
 http://localhost:5984/db/_design/app/_update/accumulate/my_doc?amount=15
# Returns: I incremented my_doc by 15

curl http://localhost:5984/db/my_doc
# Returns {"_id":"my_doc","_rev":"2-<whatever>",
#          "number":38}

Обратите внимание, что новое значение number равно 38, значение 23 + 15.

4 голосов
/ 25 марта 2014

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

curl --dump-header - -H "Content-Type:application/json" -X POST http://localhost:5984/db/_design/app/_update/modifyinplace/_design/app -d @update.json

, где update.json содержит:

{"_id": "_design/app",
    "updates": {
        "modifyinplace": "function (doc, req) { var fields = JSON.parse(req.body); for (var i in fields) { doc[i] = fields[i] } var resp = eval(uneval(doc)); delete resp._revisions; return [doc, toJSON(resp)]; }"
     }
}

Несколько вещей заслуживают внимания. Заявление var resp = eval(uneval(doc)), клоны doc. Больше информации о клонировании здесь . Так как поле _revisions может стать большим, удаление его в ответе имеет смысл для моего варианта использования. Использование toJSON(resp) отправляет ответ в виде строки, однако значение _rev в успешном ответе будет неправильным. Чтобы получить правильную версию успешного обновления, посмотрите X-Couch-Update-NewRev в заголовке ответа. Обновление вполне может не увенчаться успехом и привести к конфликту , как указано здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...