0

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

Timestamp |id | Name | Marks 
  • 时间戳表示一年中每周某天举行考试的数据。示例:每年 5 个学生的 5 个考试周对于同一组学生将有 5 个时间戳。
  • id 是与每个学生关联的唯一键。
  • 我已使用分区键作为时间戳(因为我有兴趣了解特定周内考试的班级表现。
  • 我使用 id 作为行键(在我的情况下并不重要,因为我不使用它来过滤)现在,在客户端应用程序中,我通过分区键(时间戳)获取数据并添加一个附加层来处理详细信息每个学生。我必须为大学里的每个学生(学生人数众多)都这样做。

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

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

4

1 回答 1

0

例子:

期望您的分区键(时间戳)值为: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;
}
于 2019-12-16T22:36:44.050 回答