代码之家  ›  专栏  ›  技术社区  ›  JDT

如何循环集合中的所有文档-Azure CosmosDB-Nodejs

  •  1
  • JDT  · 技术社区  · 6 年前

    我收集了一些文件(简体):

    {
        "id": 123
        "stuff": "abc"
        "array":[
            {
            "id2":456
            "properties": [
                    {
                        "id3": 789
                        "important": true
                    }
                ]
            }
        ]
    } 
    

    我想检查一下 for 对于 每个 array 内的对象 数组 , 每个 properties ,如果有 important: true 例如。然后返回:

    "id": 123
    "id2": 456
    "id3": 789
    

    client.queryDocuments(self.collection._self, querySpec).toArray(function(err, results) {
        if (err) {
            callback(err);
        } else {
            callback(null, results[0]);
        }
        });
    

    Javascript Increase max array size )

    或者,我是不是误解了上述问题?它是不是在讨论数组中对象的数量(其中每个对象可以有无限的对象字符长度?)

    所以我要找一个 for loop

    任何见解都将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Jay Gong    6 年前

    但问题是数组有一个最大字符限制。如果我的 集合中有数百万个文档,这可能是

    基于我的 research ,js中最长的数组可能有232-1= 4,294,967,295 4.29 十亿个元素。但是,它完全可以满足数百万数据量的需求。另外,你不能直接查询如此庞大的数据量,这是不可能的。

    不管是吞吐量限制(RUs设置)还是查询效率因素,您都应该考虑批量处理大量数据。

    因此,我正在寻找一个for循环式的解决方案,其中每个文档 返回时,我进行分析,然后移动到下一步/进行分析 平行。

    v2 js sdk

    const cosmos = require('@azure/cosmos');
    const CosmosClient = cosmos.CosmosClient;
    
    const endpoint = "https://***.documents.azure.com:443/";                 // Add your endpoint
    const masterKey = "***";  // Add the masterkey of the endpoint
    const client = new CosmosClient({ endpoint, auth: { masterKey } });
    const databaseId = "db";
    const containerId = "coll";
    
    async function run() {
        const { container, database } = await init();
        const querySpec = {
            query: "SELECT r.id,r._ts FROM root r"
        };
        const queryOptions  = {
            maxItemCount : -1
        }
       const queryIterator = await container.items.query(querySpec,queryOptions);
        while (queryIterator.hasMoreResults()) {
            const { result: results, headers } = await queryIterator.executeNext();
            console.log(results)
            console.log(headers)
            //do what you want to do
    
            if (results === undefined) {
                // no more results
                break;
            }   
        }
    }
    
    async function init() {
        const { database } = await client.databases.createIfNotExists({ id: databaseId });
        const { container } = await database.containers.createIfNotExists({ id: containerId });
        return { database, container };
    }
    
    run().catch(err => {
        console.error(err);
    });
    

    有关续航令牌的详细信息,请参阅我的 previous case

        2
  •  0
  •   Amlan    6 年前

    我正在使用cosmosdbsqlapi节点.js图书馆。我找不到此库中的延续令牌,因此我可以将其返回给客户端。这样做的目的是在下一个分页请求中从客户机取回它。

    我有一个工作代码,它会多次迭代以获取所有文档。这里需要什么更改才能获得延续令牌?

    function queryCollectionPaging() {  
    return new Promise((resolve, reject) => {
        function executeNextWithRetry(iterator, callback) {         
            iterator.executeNext(function (err, results, responseHeaders) {
                if (err) {
                    return callback(err, null);
                }
                else {
                    documents = documents.concat(results);
                    if (iterator.hasMoreResults()) {
                        executeNextWithRetry(iterator, callback);
                    }
                    else {
                        callback();
                    }
                }
            });
        }
    
        let options = {
            maxItemCount: 1,
            enableCrossPartitionQuery: true
        };
    
        let documents = []
        let iterator = client.queryDocuments( collectionUrl, 'SELECT r.partitionkey, r.documentid, r._ts FROM root r WHERE r.partitionkey in ("user1", "user2") ORDER BY r._ts', options);
    
        executeNextWithRetry(iterator, function (err, result) {
            if (err) {
                reject(err)
            }
            else {
                console.log(documents);
                resolve(documents)
            }
        });
    });