带排序的 DocumentDB 分页

DocumentDB paging with sorting

我试图在启用排序和分页的情况下从 azure DocumentDb 检索一些文档。

           var feedOptions = new FeedOptions
            {
                EnableCrossPartitionQuery = true,
                MaxItemCount = size,
                EnableScanInQuery = true
            };
            if (!string.IsNullOrEmpty(continuationToken))
            {
                feedOptions.RequestContinuation = continuationToken;
            }

            var query = Client.CreateDocumentQuery<T>(this.Collection.SelfLink, feedOptions)
                .Where(filterPredicate)
                //.OrderBy(sortingPredicate)
                .AsDocumentQuery();

            var result = await query.ExecuteNextAsync<T>();

            var responseContinuationToken = result.ResponseContinuation;
            var collection = result.AsEnumerable().ToList();
            return new PageModel<T> { Collection = collection, ContinuationToken = responseContinuationToken };

无需排序也能正常工作。但是,当我添加 OrderBy(sortingPredicate) 时,它会 returns 在 responseContinuationToken 中添加文本 "ParallelDocumentQueryExecutionContext"

我想知道为什么它会这样?

编辑:

我已经添加了

Range type indexing

所有属性,所以这不是问题,它也按预期订购项目。但我面临的问题是寻呼。我在集合中有数千个文档,我只想在每组中用 20 个条目对它们进行分页。因此,当我删除 orderBy 谓词时,它无需排序即可工作,它在每页上给我 20 个文档。我只是转发延续令牌。而这个延续令牌是一个随机字符串,每次都会发生变化。但是当我使用 OrderBy 时 result.ResponseContinuation returns "ParallelDocumentQueryExecutionContext" 而不是随机字符串。结果,尽管它被排序了,但每次 returns 都是相同的结果。

如果我们针对 JSON 文档中出现的 any/all 数字或字符串属性创建一个集合,并为排序依据创建具有“所有范围”索引的集合,则 Azure documendb 支持排序依据。更多详情请参考document.

DocumentCollection books = new DocumentCollection();
books.Id = "books";
books.IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) { Precision = -1 });

await client.CreateDocumentCollectionAsync(UriFactory.CreateDatabaseUri("dbname"), books);

我无法重现你提到的问题。

我假设是你的oderby sortingPredicate引起的,我们可以通过以下方式排查:

  1. 尝试在 Azure 门户中执行 SQL 查询,如果失败,我们可以获得更多详细信息。

  1. document我们也知道我们目前无法执行以下操作

Order By with internal string properties like id, _rid, and _self (coming soon).

Order By with properties derived from the result of an intra-document join (coming soon).

Order By multiple properties (coming soon).

Order By with queries on databases, collections, users, permissions or attachments (coming soon).

Order By with computed properties e.g. the result of an expression or a UDF/built-in function.

注意:如果未解决,请分享您的OrderBy(sortingPredicate)

编辑:

我无法重现你在我这边提到的问题,我也可以在使用 groupby 和 responseContinuation 时获得下一页。

问题出在分区键上。未提供 分区键 ,这就是它一遍又一遍地返回相同结果的原因。在提供正确的 分区键 后,它正在运行。