Что является хорошей тактикой для запроса Cosmos DB (API хранилища таблиц), чтобы получить «следующий» элемент в хранилище? «Далее» определяется как первый элемент, который не был возвращен последним вызовом. Элемент, возвращенный последним вызовом, хранится в памяти. Используя .NET Framework, C #. Ожидается, что таблица будет содержать около 2 миллионов записей, поэтому сканирование таблиц не является предпочтительным. :)
Табличное хранилище выглядит следующим образом: Ключ раздела (составной из нескольких значений): «0000/00/01 / 2020-01-11». Например, ключ строки одиночное целое значение 1. Строка содержит другие строковые данные.
Итак, пары ключ-значение (ключ раздела и ключ строки) выглядят следующим образом. Приложение требует большого количества операций чтения, но не обязательно использует шаблон хвоста журнала (https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-design-guide#log-tail-pattern).
0000/00/01/2020-01-11,1,aaa,x
0000/00/01/2020-01-11,2,aaa,y
0000/00/01/2020-01-11,3,aaa,z
0000/00/01/2020-01-11,4,bbb,x
0001/00/01/2020-01-11,5,aaa,x
0001/00/01/2020-01-11,6,ddd,x
(Обратите внимание, что две нижние сущности будут в другом разделе, поэтому «aaa, x» существует в двух разделах).
Поэтому я думаю, что запрос на получение только одного предмета - это
TableQuery<MyClass> query = new TableQuery<MyClass>()
.Where(TableQuery.GenerateFilterCondition("0000/00/01/2020-01-11", QueryComparisons.Equal, "aaa")).Take(1);
Если это правильный код и возвращает «aaa, x», как гарантировать, что следующий запрос получит «aaa, y», а следующий - «aaa, z», а следующий - «bbb, x» и следующий снова получит "aaa, x" в том же разделе?
Если нет смысла создавать многофункциональные объекты, а вместо этого напрямую запрашивать REST API и, возможно, сохранить элемент, который последний раз использовался в другой таблице и во внешнем соединении или другом условии фильтра между двумя таблицами, я открыт для проектирования в вместо этого.
Спасибо!
1,2,3,4,5,6
- это ключи строк вашего примера, но вам нужно найти все значения с заданным значениемaaa
, которые могут быть строками1,4,5
. Это означает, что вы практически ничего не знаете о ключе строки. Вы только знаете, что он должен быть выше, чем последний, который я нашел. У вас будет немного сканирования, я не понимаю, как вы хотите достичь O (1), как вы описываете в награде. Я правильно это понимаю? - person Alex AIT   schedule 21.01.2020GenerateFilterCondition (string propertyName, string operation, string givenValue)
- person Alex AIT   schedule 21.01.2020