Golang / CosmosDB 分页

Golang / CosmosDB Pagination

我正在尝试实现分页,同时 select 使用 cosmosapi package 从 CosmosDB 读取记录。 azure documentation 声明延续令牌永不过期,我正在尝试理解其语义。

中有一个约定

Documents created after serving the first page are observable on subsequent pages

我试图通过 运行 来自 golang 应用程序的一些实验来验证这一点,但有些地方不太正确。作为一个非常高级的示例,如果我们向 CosmosDB 中插入三个记录:

Insert record #1
Insert record #2
Insert record #3

然后,如果我们尝试使用此选项从 table(query = SELECT * FROM c ORDER BY c.dateField DESC)select:

opts := cosmosapi.QueryDocumentsOptions{
    IsQuery:              true,
    ContentType:          cosmosapi.QUERY_CONTENT_TYPE,
    ConsistencyLevel:     cosmosapi.ConsistencyLevelStrong,
    Continuation:         "",
    PartitionKeyValue:    partitionKeyValue,
    MaxItemCount:         2,
}

它returns:

record #1
record #2 
continuation token = "cont-token-1"

现在当 select再次使用相同的选项,但不同的延续标记时:

opts := cosmosapi.QueryDocumentsOptions{
    IsQuery:              true,
    ContentType:          cosmosapi.QUERY_CONTENT_TYPE,
    ConsistencyLevel:     cosmosapi.ConsistencyLevelStrong,
    Continuation:         "cont-token-1",
    PartitionKeyValue:    partitionKeyValue,
    MaxItemCount:         2,
}

它returns

record #3

这是相当合乎逻辑的。 现在,当我尝试插入记录 #4,它被插入到记录 #3 之后,并尝试使用“cont-token-1”获取时,记录 #4 没有出现。它仅在我使用空 opts.Continuation 字段再次 selecting 重新生成延续标记时显示。

如果我尝试 select 使用空的继续标记,那么它会获取记录 #1 和记录 #2,并导致获取记录 #3 和记录 #4 的新标记。

这是预期的行为吗?还是我错过了什么? 根据我的理解,它应该出现。延续令牌就像一个书签,即使使用相同的延续令牌也应该能看到结果。

延续令牌只能用于完全相同的查询,并且每次都会 return 完全相同的答案,无论您如何更改基础数据,如果您的基础数据,您都需要获取一个新令牌数据以第一个答案中包含的方式更改。