Я новичок в CouchDB, но думаю, что смогу помочь.Я прочитал следующее из CouchDB: Полное руководство :
Один недостаток разбиения на страницы в стиле связанного списка состоит в том, что ... переход на определенную страницу на самом деле не работает... Если вам действительно нужно перейти на страницу по всему диапазону документов ... вы все равно можете поддерживать индекс целочисленных значений в качестве индекса представления и использовать гибридный подход к решению разбиения на страницы.- http://books.couchdb.org/relax/receipts/pagination
Если я правильно понял, подход в вашем случае будет следующим:
- Вставьте числовую последовательность в ваш набор документов.
- Извлечение этой числовой последовательности в индекс числового представления.
- Использование арифметики для вычисления правильных начальных / конечных цифровых клавиш для вашей произвольной страницы.
Для шага 1,вам нужно добавить что-то вроде «page_seq» в качестве поля в ваш документ.У меня нет конкретной рекомендации о том, как вы получаете этот номер, и мне любопытно узнать, что думают люди.Чтобы эта схема работала, она должна увеличиваться ровно на 1 для каждой новой записи, так что последовательности СУБД, вероятно, отсутствуют (те, с которыми я знаком, могут пропускать числа).
Для шага 2 вы бынапишите представление с функцией карты, которая выглядит примерно так (в Javascript):
function(doc):
emit(doc.page_seq, doc)
На шаге 3 вы напишите свой запрос примерно так (при условии, что последовательности page_seq и нумерации страниц начинаются с 1):
results = db.view("name_of_view")
page_size = ... # say, 20
page_no = ... # 1 = page 1, 2 = page 2, etc.
begin = ((page_no - 1) * page_size) + 1
end = begin + page_size
my_page = results[begin:end]
и затем вы можете перебирать my_page.
Очевидным недостатком этого является то, что page_seq предполагает, что вы не фильтруете набор данных для своего представления, и вы быстростолкнуться с проблемами, если вы пытаетесь заставить это работать с произвольным запросом.
Комментарии / улучшения приветствуются.