Обработчики обновления документа CouchDB (обновления на месте)

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

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

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

благодаря

Пример функции 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-", # "number":38} 

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

Вот что я нашел очень полезным, играя с приведенным выше примером. После установки обработчика обновлений вы можете использовать его для обновления самого обработчика обновлений. Например, если ваш обработчик обновления находится в файле 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 может стать большим, удаление его в ответе имеет смысл для моего _revisions использования. Использование toJSON(resp) отправляет ответ в виде строки, однако значение _rev в успешном ответе будет неправильным. Чтобы получить правильную версию успешного обновления, просмотрите X-Couch-Update-NewRev в заголовке ответа. Обновление вполне может не увенчаться успехом и привести к конфликту, как описано здесь.

Давайте будем гением компьютера.