Я работаю с PouchDB для хранения некоторых документов в браузере, у меня есть коллекция объектов, которые мне удалось db.put, и теперь мне нужно их «обновить», но без необходимости вручную ставить параметр _rev. Я знаю, что параметр _rev требуется, но я думал просто сохранить обновленный объект как новый документ, так как считаю, что это меньше накладных расходов. Мой вопрос в том, как я могу получить все документы и получить только один (самый последний) отправленный документ каждого из них. Я думаю поставить им отметку времени, но я не хочу на это полагаться. Любая ориентация будет высоко оценена.
Вы можете обновлять отдельные документы без проверки с помощью обработчика обновлений. https://docs.couchdb.org/en/latest/ddocs/ddocs.html?#update-функции
Обновление нескольких документов с получением новейших
Обновить несколько документов с помощью метки времени или номера версии можно следующим образом:
Чтобы получить новейшую версию документа, вы можете написать представление и уменьшить его, чтобы показать максимальное значение:
Ваша реализация может выглядеть так:
// Your documents
// PUT #1
{
_id: "test_doc_[timestamp],
doc_id: "test_doc",
doctype: "book",
timestamp: [timestamp],
payload: "lorem ipsum"
}
// PUT #2
{
_id: "test_doc_[timestamp + n],
doc_id: "test_doc",
doctype: "book",
timestamp: [timestamp + n],
payload: "dolor sit amet"
}
Получение последней версии одного документа
Чтобы получить новейшую версию test_doc, вы можете использовать _all_docs. Что делает запрос ниже, так это то, что он запрашивает все ваши документы, начиная с вашего идентификатора документа, сортирует их по убыванию и возвращает вам верхний набор данных, который в вашем случае будет самым новым.
GET /db/_all_docs?start_key = "test_doc_"&end_key = "test_doc_\ufff0"&descending=true&limit=1
Получение новейших версий многих документов
Чтобы получить самую новую версию многих документов, вы можете написать представление, а затем уменьшить его:
// view not formated so that it can be used directly
{
"_id": "_design/books",
"views": {
"newest": {
"reduce": "function (key, values, rereduce) {\r\n return Math.max.apply({}, values);\r\n}",
"map": "function (doc) {\n if (doc.doctype === \"book\")\n emit(doc.doc_id, doc.timestamp);\n}"
}
},
"language": "javascript"
}
Вы можете вызвать представление с помощью:
GET /db/_design/books/_view/newest?descending=true&reduce=true&group=true
Источники:
https://docs.couchdb.org/en/latest/ddocs/ddocs.html?#map-функции
Как рассчитать максимальное значение с помощью Map-Reduce в CouchDB?