首页 > 解决方案 > 通过批处理 Azure Cosmos DB 中的表从同一分区获取不同的行键

问题描述

我的表中有一些基于时间的数据,其架构如下:

Timestamp |id | Name | Marks 

我想知道是否有更好的方法来获取这些结果(基本上减少调用次数),方法是在每次调用中批处理行键以按分区键进行过滤?

示例:由于我一次查找一周的数据,因此它只有一个 date 。那个日期就是分区键。假设今天有 10000 名学生参加了考试。我不想给 Cosmos DB 打 10K 电话给我他们的分数。相反,由于我们正在查看同一个分区,有没有办法通过过滤掉不需要的行来进行 <10K 调用?

标签: azureazure-cosmosdbazure-cosmosdb-tables

解决方案


例子:

期望您的分区键(时间戳)值为:A 并且您的学生 ID 是b1,b2,b3,b4
现在如果您只想查询学生b1b3的 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;
}

推荐阅读