首页 > 解决方案 > Cosmos DB 在延续令牌中返回意外值“过滤器”

问题描述

我有以下 json 对象:

  {
    "id": "9df7d70e-1b07-4080-ac9e-964332c93a89",
    "name": "some name",
    "ranking": {
         "A": 1,
         "B": 2,
     }
  }

我想使用pagination根据键AB对项目进行排序

我为此使用的查询:

SELECT * FROM c WHERE ... ORDER BY c.ranking['A'] ASC

分页参数:

FeedOptions feedOptions = new FeedOptions()
        {
            MaxItemCount = cosmosDbSettings.PageResultsCount,
            RequestContinuation = continuationToken,
            EnableCrossPartitionQuery = true
        };

触发 cosmos db:

      var docQuery = documentClient.CreateDocumentQuery<dynamic>(
            UriFactory.CreateDocumentCollectionUri(cosmosDbSettings.DatabaseId, collectionId),
            new SqlQuerySpec(query, sqlParameters),
            feedOptions)
            .AsDocumentQuery();
        var results = new PagedResources();
        List<dynamic> resources = new List<dynamic>();
        var queryResult = await docQuery.ExecuteNextAsync();

        while (queryResult.Count == 0 && docQuery.HasMoreResults)
        {
            queryResult = await docQuery.ExecuteNextAsync();
        }

        if (!queryResult.Any())
        {
            return results;
        }

对于第一页和第二页,它工作正常,然后突然缺少一些项目作为响应。

在令牌过滤器的末尾出现

filter":"c.ranking[\"A\"] >= 2"

整个令牌:

[{"compositeToken":{"token":"+RID:~oClCAPq5X0KLAAAAAAAAAA==#RT:2#TRC:20#RTD:GQD5+RFVofBwed+BlCvhBMAU#ISV:2#IEO:65551#FPC:AgEAAAAcAHMAwP1gHxAAUgB4ABgAEQAAGDaA4wAcAABgwkM=","range":{"min":"","max":"05C1DFFFFFFFFC"}},"orderByItems":[{"item":5}],"rid":"oClCAPq5X0KMAAAAAAAAAA==","skipCount":0,"filter":"c.ranking[\"A\"] >= 2"}]

也许我错过了一些东西,任何帮助将不胜感激!

标签: c#.net-corepaginationazure-cosmosdb

解决方案


请确保您排空所有查询结果(来源):

while (docQuery.HasMoreResults)
{
    var queryResult = await docQuery.ExecuteNextAsync();
    resources.AddRange(queryResult);
}

return resources;

此外,延续令牌的内容是不透明的,它包含的任何内容都是为了让查询引擎在您下次想要恢复时使用。如果您耗尽所有结果(如我所示),它将是null.


推荐阅读