Токен продолжения 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 (без эффекта)

Что я делаю не так?

0 ответов

Другие вопросы по тегам