【问题标题】:Cosmo Sql Db - Querying data using continuation tokens never finishesCosmos Sql Db - 使用延续令牌查询数据永远不会完成
【发布时间】:2018-05-31 05:08:05
【问题描述】:

我的数据库包含来自租户 ID 标识的多个数据源的数据。一个租户有数百万条记录,而另一个租户只有 75 条记录,如下面的截图

当我使用以下代码查询数据时

  var count = continuationToken?.Count ?? ContinuationToken.DefaultPageCount;
        var feedOptions = new FeedOptions
        {
            EnableCrossPartitionQuery = true,
            MaxItemCount = count,
            RequestContinuation = continuationToken?.NextRowKey
        };

        var query = sortByAscending
            ? _client.CreateDocumentQuery<T>(_collection.DocumentsLink, feedOptions).Where(filter).OrderBy(order).AsDocumentQuery()
            : _client.CreateDocumentQuery<T>(_collection.DocumentsLink, feedOptions).Where(filter).OrderByDescending(order).AsDocumentQuery();

        var feedResponse = await query.ExecuteNextAsync<T>();
        var items = feedResponse.AsEnumerable().ToList();
        var nextPageToken = feedResponse.ResponseContinuation;

        return new ContinuationTokenData<T>(items, items.Count, nextPageToken, count);

过滤器位于租户 ID 上。前 2 页(每页 25 条记录)的数据很好地返回给租户。但是,当它到达最后 25 条记录时,延续令牌不断重复旧值,如下所示

你知道如何解决这个问题还是这是 CosmoDb 的一个错误?谢谢

【问题讨论】:

    标签: c# .net azure azure-cosmosdb


    【解决方案1】:

    当 token 为空时,它实际上意味着没有继续(如请求 2 和 4)。

    如果您发送 FeedOptions RequestContinuation = null 它将始终返回第一页。

    【讨论】:

    • 继续标记设置正确,它是一个复合值,如屏幕截图所示。返回的数据页不是第一页。它在过滤条件的最后一页和倒数第二页之间交替。当第一个请求发出时(RequestContinuation = null),第一页数据按预期返回
    • 托安,你发现问题出在哪里了吗?
    • 嗨奥尔加。我还没有发现问题出在哪里。我跟着文档,只是提取了延续令牌,Azure只是重复了令牌!
    • 这部分代码看起来还不错。您能否在您执行分页周期以及定义过滤器和顺序变量的位置发布更多代码。您使用什么索引策略?
    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多