Зачем вам курсоры на основе docid?
Map Reduce создает одномерные индексы, поэтому любой обход неключевого ключа будет дорогим.Тем не менее, я думаю, что вы можете делать то, что вы хотите, не требуя обхода двух индексов одновременно.
Посмотрите, например, здесь, как я разбиваю посты с определенным тегом:
Пагинация тега CouchApp на диване
aka
http://jchris.couchone.com/sofa/_design/sofa/_list/index/tags?descending=true&reduce=false&limit=10&startkey=[%22life%22%2C{}]&endkey=[%22life%22]
Ключ в этом представлении выглядит как ["tag", "2008/10/25 04:49: 10 +0000 "], так что вы можете разбивать на страницы по тегам и по тегам по времени.
Отредактировано
Ха!Я только что понял, что ты пытаешься сделать.Это так очень просто.
Забудьте все о документах, они все равно должны быть случайными и ни с чем не связанными, поэтому просто забудьте, что у документов даже есть идентификаторы на секунду.
Вы говорите: «Запрос уровня приложения с курсором 234, размер страницы 3 должен возвращаться: 234, 987, 103»
Ваш курсор не должен быть 234. Это должна быть клавиша «2010-06-22T12: 21: 23.123Z ".
Таким образом, по сути, вы используете ключ последней строки результатов в качестве начальной клавиши для следующего запроса.Например, startkey = "" 2010-06-22T12: 21: 23.123Z "" & limit = 3, затем для каждой отображаемой страницы укажите ссылку на запрос, где новый ключ запуска является последним возвращенным ключом.
Bonus: с тем, что я только что описал, нижняя строка страницы 2 будет иметь верхнюю строку страницы 3. Чтобы это исправить, добавьте в свой запрос skip = 1.
Бонусный бонус: ОК, чтоо том, когда у меня более 3 документов, которые отправляются на один и тот же ключ в представлении?Тогда последний ключ всегда будет таким же, как первый ключ, поэтому вы не сможете перейти на нумерацию страниц без расширения параметра limit.Если только вы не используете startkey_docid (и задаете для него идентификатор последней строки).Это единственный раз, когда вы должны использовать startkey_docid.