我有一个使用SQL / DocumentDB接口的CosmosDB实例。我通过.NET SDK访问它。
我有使用ExecuteStoredProcedureAsync调用的存储过程。但我最多只能获得100份文件。我知道这是默认选项。我可以改变吗?
ExecuteStoredProcedureAsync的可选参数是RequestOptions对象。 RequestOptions没有MaxItemCount或continuation tokens的属性。
您需要更改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。
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.');
}
结果: