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

JDT*_*JDT 5 arrays for-loop azure node.js azure-cosmosdb

我已经查看了有关此问题的一些答案/问题,但尚未找到解决方案。

我有一个包含文档(简化)的集合,如下所示:

{
    "id": 123
    "stuff": "abc"
    "array":[
        {
        "id2":456
        "properties": [
                {
                    "id3": 789
                    "important": true
                }
            ]
        }
    ]
} 
Run Code Online (Sandbox Code Playgroud)

我想检查for我的集合中的每个文档,for每个array对象arrayfor每个对象properties,如果有的important: true话。然后返回:

"id": 123
"id2": 456
"id3": 789
Run Code Online (Sandbox Code Playgroud)

我尝试过使用:

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

但问题是数组有最大字符数限制。如果我的收藏有数百万份文档,这可能会超出。(Javascript增加最大数组大小

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

因此,我正在寻找一个for loop类似的解决方案,其中返回每个文档,我进行分析,然后移动到下一个/并行执行它们。

任何见解将不胜感激。

Jay*_*ong 1

但问题是数组有最大字符数限制。如果我的收藏有数百万份文档,这可能会超出。(Javascript 增加最大数组大小)

根据我的研究,js 中最长的数组可能有 232-1 ==4,294,967,295十亿4.29个元素。不过,它完全足以满足您数百万数据量的需求。另外,你肯定不能直接查询这么海量的数据,那是不可能的。

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

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

也许您可以使用v2 js sdk for cosmos db sql api。请参考示例代码:

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);
});
Run Code Online (Sandbox Code Playgroud)

关于延续令牌的更多细节,请参考我之前的案例。如有任何疑问,请告诉我。