Я не уверен относительно утверждения «Я снова получаю те же строки». Это воспроизводимо, если startkey
является первым, а не последним ключом предыдущего результата - и это будет первая проблема.
Независимо от того, что startkey
является правильным параметром skip
и startkey
конфликтуют. Первоначально skip
должно быть 0, а затем должно быть 1, чтобы пропустить startkey
в последовательных запросах.
Этот метод четко описан в документации по пагинации CouchDB 1 .
Подробности
Предположим, что представление complete (где ключом является unix отметка времени) равно
{
"total_rows":7,
"offset":0,
"rows":[
{"id":"821985c5140ca583e108653fb6091ac8","key":1580050872331,"value":null},
{"id":"821985c5140ca583e108653fb6092c3b","key":1580050872332,"value":null},
{"id":"821985c5140ca583e108653fb6093f47","key":1580050872333,"value":null},
{"id":"821985c5140ca583e108653fb6094309","key":1580050872334,"value":null},
{"id":"821985c5140ca583e108653fb6094463","key":1580050872335,"value":null},
{"id":"821985c5140ca583e108653fb60945f4","key":1580050872336,"value":null},
{"id":"821985c5140ca583e108653fb60949f3","key":1580050872339,"value":null}
]
}
. исходные условия запроса
{
limit: 5,
descending: true,
include_docs: false // for brevity
}
действительно дают ожидаемый результат, 5 строк с самым последним первым
{
"total_rows":7,
"offset":0,
"rows":[
{"id":"821985c5140ca583e108653fb60949f3","key":1580050872339,"value":null},
{"id":"821985c5140ca583e108653fb60945f4","key":1580050872336,"value":null},
{"id":"821985c5140ca583e108653fb6094463","key":1580050872335,"value":null},
{"id":"821985c5140ca583e108653fb6094309","key":1580050872334,"value":null},
{"id":"821985c5140ca583e108653fb6093f47","key":1580050872333,"value":null}
]
}
Теперь предположим, что второй запрос таков
{
limit: 5,
descending: true,
include_docs: false, // for brevity
startkey: 1580050872333,
skip: 5
}
startkey
(ключ последней строки предыдущего результата) верен, но параметр skip
буквально пропускает следующий (логический) набор строк. В частности, с этими параметрами и приведенным выше примером, запрос будет проходить мимо оставшихся ключей, что приведет к пустому набору строк.
Это то, что нужно:
{
limit: 5,
descending: true,
include_docs: false, // for brevity
startkey: 1580050872333,
skip: 1 // just skip the last doc (startkey)
}
1 CouchDB Pagination Recipes 3.2.5.5. Пейджинг (альтернативный метод)