DocumentDB,如何在SP中使用continuationToken

时间:2016-07-28 15:39:51

标签: azure stored-procedures azure-cosmosdb

下一个SP假设在集合上运行并继续查询下一批文档(每批10个文档)。但每次都要返回相同的10个文件。

function sample(prefix) {
var continuations = [],
ids = [],
 context = getContext(),
     collection = context.getCollection(),
     response = context.getResponse();
var queryOptions = { pageSize: 10, continuation: null };

for (i = 0; i < 10; i++) {
    // get all user wish list actions
    var query = "select * from w",
    accept = collection.queryDocuments(collection.getSelfLink(), query, queryOptions, processMultiUsers);
    if (!accept) throw "Unable to read user's sessions";
}
getContext().getResponse().setBody(ids);


function processMultiUsers(err, docs, options) {
    if (err) throw new Error("Error: " + err.message);
    if (docs == undefined || docs.length == 0) throw new Error("Warning: Users not exists");

    for (j = 0; j < docs.length; j++) {
        ids.push(docs[j].UserId);
    }
    queryOptions.continuation = options.continuation;
    continuations.push(options.continuation);
}}

1 个答案:

答案 0 :(得分:0)

在您编写的脚本中,查询的执行是同步完成的,并且它们使用相同的初始延续令牌排队,该令牌为空。相反,我们需要从第一个查询中获取令牌,然后对下一个查询进行排队并继续。

以下示例应该有助于实现您的目标

function sample(continuationToken) {
    var collection = getContext().getCollection();
    var maxResult = 10;
    var documentsProcessed = 0;
    var ids = [];
    var filterQuery = "select * from w";

    tryQuery(continuationToken);

    function tryQuery(nextContinuationToken) {
        var responseOptions = { continuation: nextContinuationToken, pageSize: maxResult };
        if (documentsProcessed >= maxResult || !query(responseOptions)) {
            setBody(nextContinuationToken);
        }
    }

    function query(responseOptions) {
        return (filterQuery && filterQuery.length) ?
            collection.queryDocuments(collection.getSelfLink(), filterQuery, responseOptions, onReadDocuments) :
            collection.readDocuments(collection.getSelfLink(), responseOptions, onReadDocuments);
    }

    function onReadDocuments(err, docFeed, responseOptions) {
        if (err) {
            throw 'Error while reading document: ' + err;
        }

        documentsProcessed += docFeed.length;

        for (var i = 0; i < documentsProcessed; i++) {
            ids.push(docFeed[i].UserId);
        }

        if (responseOptions.continuation) {
            tryQuery(responseOptions.continuation);
        } else {
            setBody(null);
        }
    }

    function setBody(continuationToken) {
        var body = { continuationToken: continuationToken, documentsProcessed: documentsProcessed, ids: ids };
        getContext().getResponse().setBody(body);
    }
}