Azure Table 获取下一个功能?
Azure Table Get Next Functionality?
查询 Cosmos DB(Table 存储 API)以获取存储中的 "next" 项的好策略是什么? "Next" 定义为上次调用未返回的前 1 项。上次调用返回的项目保存在内存中。使用.NET Framework,C#。 Table 预计将包含大约 200 万个条目,因此 table 扫描不是首选。 :)
Table 存储看起来像这样:
分区键(多个值的组合):“0000/00/01/2020-01-11”。
例如,行键单个 int 值 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);
如果那个代码是正确的,returns"aaa,x"如何保证后面的查询会得到"aaa,y",下一个会得到"aaa,z",以及下一个将获得 "bbb,x",下一个将在同一分区中再次获得 "aaa,x"?
如果创建丰富的对象没有意义,而是直接查询 REST API 并且可能保留上次在另一个 Table 和 Outer Join 或其他过滤器中使用的项目两个 table 之间的条件,我愿意朝那个方向设计。
谢谢!
两个可能的想法取决于您的其他要求:
- 通过跟踪最后一个行键手动遍历行
- 定义查询以获取所有符合您条件的行,并利用
TableContinuationToken
您可能需要根据您的具体要求调整我的示例中的过滤器,但这个想法应该适合任何一种方式。
通过跟踪最后一个行键手动遍历行
string currentPartitionKey = "0000/00/01/2020-01-11";
string currentRowKey = "-1";
var query = new TableQuery()
.Where(TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, currentPartitionKey),
TableOperators.And,
// For the very first query, you may be able to omit this condition
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThan, currentRowKey)))
.Take(1);
// Execute, do stuff
// Switch to next partitionKey if no results were found
定义查询以获取符合您条件的所有行,并利用 TableContinuationToken
代码可能如下所示:
string currentPartitionKey = "initialParitionkey";
do
{
TableContinuationToken continuationToken = null;
do
{
TableQuery query = new TableQuery()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, currentPartitionKey));
var segment = await table.ExecuteQuerySegmentedAsync(query, continuationToken,
new TableRequestOptions { TableQueryMaxItemCount = 1 }, cancellationToken);
continuationToken = segment.ContinuationToken;
// process results
}
while (continuationToken != null)
currentPartitionKey = getNextPartitionKey(currentPartitionKey);
}
while (currentPartitionKey != null)
查询 Cosmos DB(Table 存储 API)以获取存储中的 "next" 项的好策略是什么? "Next" 定义为上次调用未返回的前 1 项。上次调用返回的项目保存在内存中。使用.NET Framework,C#。 Table 预计将包含大约 200 万个条目,因此 table 扫描不是首选。 :)
Table 存储看起来像这样: 分区键(多个值的组合):“0000/00/01/2020-01-11”。 例如,行键单个 int 值 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);
如果那个代码是正确的,returns"aaa,x"如何保证后面的查询会得到"aaa,y",下一个会得到"aaa,z",以及下一个将获得 "bbb,x",下一个将在同一分区中再次获得 "aaa,x"?
如果创建丰富的对象没有意义,而是直接查询 REST API 并且可能保留上次在另一个 Table 和 Outer Join 或其他过滤器中使用的项目两个 table 之间的条件,我愿意朝那个方向设计。
谢谢!
两个可能的想法取决于您的其他要求:
- 通过跟踪最后一个行键手动遍历行
- 定义查询以获取所有符合您条件的行,并利用
TableContinuationToken
您可能需要根据您的具体要求调整我的示例中的过滤器,但这个想法应该适合任何一种方式。
通过跟踪最后一个行键手动遍历行
string currentPartitionKey = "0000/00/01/2020-01-11";
string currentRowKey = "-1";
var query = new TableQuery()
.Where(TableQuery.CombineFilters(
TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, currentPartitionKey),
TableOperators.And,
// For the very first query, you may be able to omit this condition
TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.GreaterThan, currentRowKey)))
.Take(1);
// Execute, do stuff
// Switch to next partitionKey if no results were found
定义查询以获取符合您条件的所有行,并利用 TableContinuationToken
代码可能如下所示:
string currentPartitionKey = "initialParitionkey";
do
{
TableContinuationToken continuationToken = null;
do
{
TableQuery query = new TableQuery()
.Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, currentPartitionKey));
var segment = await table.ExecuteQuerySegmentedAsync(query, continuationToken,
new TableRequestOptions { TableQueryMaxItemCount = 1 }, cancellationToken);
continuationToken = segment.ContinuationToken;
// process results
}
while (continuationToken != null)
currentPartitionKey = getNextPartitionKey(currentPartitionKey);
}
while (currentPartitionKey != null)