Azure Cosmos Db,在行后选择?

时间:2018-07-09 21:39:08

标签: azure azure-cosmosdb

我正在尝试在x行之后选择一些行,例如:

SELECT * from collection WHERE ROWNUM >= 235 and ROWNUM <= 250

不幸的是,在蔚蓝的宇宙数据库中,ROWNUM似乎没有得到解决。

还有另一种方法吗?我已经研究过使用延续标记,但是如果用户跳到第50页并没有帮助,我是否需要继续查询延续标记才能到达第50页?

我尝试过使用页面大小选项,但这在一次可以返回多少东西方面有一些限制。

1 个答案:

答案 0 :(得分:1)

  

例如,我在Azure中有1,000,000条记录。我想查询行   500,000至500,010。我无法从集合WHERE ROWNUM> = 500,000和ROWNUM <= 500,010中进行SELECT *,那我该如何实现呢?

如果没有任何过滤器,那么到目前为止,您无法通过直接查询cosmos db中的sql来检索特定范围内的项目。因此,您需要使用分页来定位您想要的项目。据我了解,到目前为止,pagination仅基于continuation token受支持。

请参考以下功能:

using JayGongDocumentDB.pojo;
using Microsoft.Azure.Documents.Client;
using Microsoft.Azure.Documents.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace JayGongDocumentDB.module
{
    class QuerySample1
    {
        public static async void QueryPageByPage()
        {
            // Number of documents per page
            const int PAGE_SIZE = 2;

            int currentPageNumber = 1;
            int documentNumber = 1;

            // Continuation token for subsequent queries (NULL for the very first request/page)
            string continuationToken = null;

            do
            {
                Console.WriteLine($"----- PAGE {currentPageNumber} -----");

                // Loads ALL documents for the current page
                KeyValuePair<string, IEnumerable<Student>> currentPage = await QueryDocumentsByPage(currentPageNumber, PAGE_SIZE, continuationToken);

                foreach (Student student in currentPage.Value)
                {
                    Console.WriteLine($"[{documentNumber}] {student.Name}");
                    documentNumber++;
                }

                // Ensure the continuation token is kept for the next page query execution
                continuationToken = currentPage.Key;
                currentPageNumber++;
            } while (continuationToken != null);

            Console.WriteLine("\n--- END: Finished Querying ALL Dcuments ---");
        }


        public static async Task<KeyValuePair<string, IEnumerable<Student>>> QueryDocumentsByPage(int pageNumber, int pageSize, string continuationToken)
        {
            DocumentClient documentClient = new DocumentClient(new Uri("https://***.documents.azure.com:443/"), "***");

            var feedOptions = new FeedOptions
            {
                MaxItemCount = pageSize,
                EnableCrossPartitionQuery = true,

                // IMPORTANT: Set the continuation token (NULL for the first ever request/page)
                RequestContinuation = continuationToken
            };

            IQueryable<Student> filter = documentClient.CreateDocumentQuery<Student>("dbs/db/colls/item", feedOptions);
            IDocumentQuery<Student> query = filter.AsDocumentQuery();

            FeedResponse<Student> feedRespose = await query.ExecuteNextAsync<Student>();

            List<Student> documents = new List<Student>();
            foreach (Student t in feedRespose)
            {
                documents.Add(t);
            }

            // IMPORTANT: Ensure the continuation token is kept for the next requests
            return new KeyValuePair<string, IEnumerable<Student>>(feedRespose.ResponseContinuation, documents);
        }
    }
}

输出:

enter image description here

希望它对您有帮助。


更新答案:

到目前为止,在cosmos db中还没有像ROW_NUMBER() [How do I use ROW_NUMBER()?]这样的功能。我也想到过skip and top。但是,top受支持并且还没有跳过(feedback)。似乎skip已经在处理中,将来会发布。

我认为您可以推送与分页功能有关的反馈。或者暂时采用continuation token以上的解决方法。