从ExecuteStoredProcedureAsync获取100多个文档

问题描述 投票:2回答:2

我有一个使用SQL / DocumentDB接口的CosmosDB实例。我通过.NET SDK访问它。

我有使用ExecuteStoredProcedureAsync调用的存储过程。但我最多只能获得100份文件。我知道这是默认选项。我可以改变吗?

ExecuteStoredProcedureAsync的可选参数是RequestOptions对象。 RequestOptions没有MaxItemCount或continuation tokens的属性。

c# azure azure-cosmosdb
2个回答
1
投票

您需要更改SP本身以调整您想要返回的记录数量。这是一个完整的例子,在SP-中实现了skip / take逻辑

function storedProcedure(continuationToken, take){

     var filterQuery = "SELECT * FROM ...";
     var accept = __.queryDocuments(__.getSelfLink(), filterQuery, {pageSize: take, continuation: continuationToken},

     function (err, documents, responseOptions) {
         if (err) throw new Error("Error" + err.message);

         __.response.setBody({
             result: documents,
             continuation: responseOptions.continuation
         });
     });
}

这是一个相应的C#代码:

        string continuationToken = null;
        int pageSize = 500;

        do
        {
            var r = await client.ExecuteStoredProcedureAsync<dynamic>(
                UriFactory.CreateStoredProcedureUri(DatabaseId, CollectionId, "SP_NAME"),
                new RequestOptions { PartitionKey = new PartitionKey("...") },
                continuationToken, pageSize);

            var documents = r.Response.result;
            // processing documents ...
            // 'dynamic' could be easily substituted with a class that will cater your needs

            continuationToken = r.Response.continuation;
        }
        while (!string.IsNullOrEmpty(continuationToken));       

如您所见,有一个参数可以控制要发送回的记录数 - pageSize。正如您所注意到的,默认情况下pageSize为100。如果您需要一次返回所有内容,请指定-1。


0
投票

RequestOptions没有MaxItemCount或continuation tokens的属性。

MaxItemCount是Feedoptions中的参数。

ExecuteStoredProcedureAsync方法不限制返回的数据条目,关键是您在存储过程中的查询操作设置了要返回的最大条目数。

请参考示例存储过程代码,如下所示:

function sample(prefix) {
    var collection = getContext().getCollection();



    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
       { pageSize: 1000 },
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            var body = "";
            for(var i=0 ; i<feed.length;i++){
                body +="{"+feed[i].id+"}";
            }
            response.setBody(JSON.stringify(body));
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.