Токен продолжения Cosmos DB возвращает неверные данные (SDK для Spring Data)
Я использую CosmosDB в Azure, и мне нужно реализовать приложение экспорта CSV для хранимых данных IoT. Обычно экспортируемые данные включают огромное количество документов (1-2 недели = около 600 000), поэтому моя логика должна использовать разбиение на страницы. Есть только два условия: 1) ключ раздела (я не выполняю межсекционный запрос), 2) диапазон отметок времени (предложение BETWEEN в терминах SQL).
В моем приложении Java Spring используется Azure Cosmos DB Spring Boot Starter версии 2.3.2. Я соблюдаю рекомендуемый способ.
Это мой код:
Sort sort = Sort.by(Sort.Direction.DESC, "dataTimestamp");
Pageable pageable = CosmosPageRequest.of(FIRST_PAGE, ROWS_PER_PAGE, null, sort);
Page<DataReading> dataPage = dataReadingRepository
.findByPartitionKeyAndDataTimestampBetween(partitionKey, start, end, pageable);
List<DataReading> content = dataPage.getContent();
// (...) write data to CSV
while (dataPage.hasNext()) {
pageable = dataPage.nextPageable();
dataPage = dataReadingRepository
.findByPartitionKeyAndDataTimestampBetween(partitionKey, start, end, pageable);
// (...) write data to CSV
}
FIRST_PAGE равен 0. ROWS_PER_PAGE равен 1000.
Основная проблема: нумерация страниц зацикливается. Что я имею в виду? Вот так выглядит первая страница:
И это нормально. Общее количество элементов соответствует количеству запросов, выполненных в веб-клиенте CosmosDB:
А вот так выглядит вторая страница:
Цикл while никогда не заканчивается. Всегда есть nextPage() (totalElements увеличивается после достижения предыдущим значением запроса).
Вот так выглядит отдельный документ:
{
"dataTimestamp": 1592940236592,
"deviceId": "xxx",
"sensorFamily": "yyy",
"measurementType": "temperature",
"dataKey": "zzz",
"reading": 23.1,
"partitionKey": "xxx-zzz",
"id": "c610a0e1-79c0-1bd0-109d-132b3fd0ab97",
"_rid": "xVQwAO79jhVSzAwAAAAACw==",
"_self": "dbs/xVQwAA==/colls/xVQwAO79jhU=/docs/xVQwAO79jhVSzAwAAAAACw==/",
"_etag": "\"0800ba43-0000-0400-0000-5ef256ce0000\"",
"_attachments": "attachments/",
"_ts": 1592940238
}
Подробности: Max RU - 50 000 Политика индексирования - по умолчанию (ничего не менял и не добавляло)
Я не изменяю поле requestContinuation (с токеном продолжения) ни на каком этапе. У меня нет исключений RequestTooLarge.
Что я пробовал:
- изменение Pageable на CosmosPageRequest (без эффекта)
- изменение страницы на CosmosPageImpl (без эффекта)
Что я делаю не так?