azure - 通过批处理 Azure Cosmos DB 中的表从同一分区获取不同的行键
问题描述
我的表中有一些基于时间的数据,其架构如下:
Timestamp |id | Name | Marks
- 时间戳表示一年中每周某天举行考试的数据。示例:每年 5 个学生的 5 个考试周对于同一组学生将有 5 个时间戳。
- id 是与每个学生关联的唯一键。
- 我已使用分区键作为时间戳(因为我有兴趣了解特定周内考试的班级表现。
- 我使用 id 作为行键(在我的情况下并不重要,因为我不使用它来过滤)现在,在客户端应用程序中,我通过分区键(时间戳)获取数据并添加一个附加层来处理详细信息每个学生。我必须为大学里的每个学生(学生人数众多)都这样做。
我想知道是否有更好的方法来获取这些结果(基本上减少调用次数),方法是在每次调用中批处理行键以按分区键进行过滤?
示例:由于我一次查找一周的数据,因此它只有一个 date 。那个日期就是分区键。假设今天有 10000 名学生参加了考试。我不想给 Cosmos DB 打 10K 电话给我他们的分数。相反,由于我们正在查看同一个分区,有没有办法通过过滤掉不需要的行来进行 <10K 调用?
解决方案
例子:
期望您的分区键(时间戳)值为:A
并且您的学生 ID 是b1,b2,b3,b4
现在如果您只想查询学生b1和b3的 A ,您可以编写:
SELECT * FROM c WHERE c.Timestamp = 'A' AND (c.id = 'b1' OR c.id = 'b3')
如果这有助于结果,您还可以在时间戳上应用GROUP BY 。
接收这些值:
通过SDK v3:
private async Task QueryItemsAsync()
{
// sql query
var sqlQueryText = "SELECT * FROM c WHERE c.Timestamp= 'A' and (c.id = 'b1' or c.id = 'b3')";
// also supports Linq
var queryDefinition = new QueryDefinition(sqlQueryText);
var queryResultSetIterator = this.container.GetItemQueryIterator<Exam>(queryDefinition);
var exams = new List<Exam>();
while (queryResultSetIterator.HasMoreResults)
{
FeedResponse<Exam> currentResultSet = await queryResultSetIterator.ReadNextAsync();
foreach (var exam in currentResultSet)
{
exams.Add(exam);
}
}
return exams;
}
推荐阅读
- javascript - 将上一个按钮添加到 vue-form-wizard 选项卡内容
- r - 具有2美学的ggline
- rust - 对具有生命周期说明符和 impl 特征的结构的可变引用的生命周期问题
- ionic-framework - 如何在离子的选定段下添加下划线?
- blazor - 在默认链接处理“之前”将 onclick 事件添加到Blazor 中的元素
- amazon-web-services - AWS Lambda - 在 CI/CD 管道中版本控制和提升 lambda 的最佳实践是什么
- python - 如何用opencv和python去除图像边缘?
- python - awswrangler 返回具有不同 dtype 的数据帧
- r - 按一个词过滤长列名并重命名此列
- mikeio - 从 2011 年开始读取 Dfs0 文件