gpt4 book ai didi

Azure 表获得下一个功能吗?

转载 作者:行者123 更新时间:2023-12-03 09:27:42 24 4
gpt4 key购买 nike

查询 Cosmos DB(表存储 API)以获取存储中的“下一个”项目的好策略是什么? “下一个”定义为上次调用未返回的前 1 个项目。上次调用返回的项目保存在内存中。使用.NET框架,C#。表预计可容纳大约 200 万个条目,因此表扫描不是首选。 :)

表存储看起来像这样:分区键(多个值的组合):“0000/00/01/2020-01-11”。例如,行键单个 int 值 1。行包含其他字符串数据。

因此键值对(分区键和行键)如下所示。该应用程序读取量很大,但不一定使用日志尾部模式 ( https://learn.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,并且可能保留另一个表中最后使用的项目以及两个表之间的外部联接或其他过滤条件,我持开放态度而是朝这个方向进行设计。

谢谢!

最佳答案

根据您的其他要求,有两种可能的想法:

  • 通过跟踪最后一个行键手动迭代行
  • 定义一个查询来获取与您的条件匹配的所有行,并利用 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)

关于Azure 表获得下一个功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59803916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com