如何递归计算子文档

时间:2020-02-07 08:13:15

标签: azure-cosmosdb

我的数据库中有如下文档:

{
  "id": "1"
  "entityType": "node"
  "childNodes": [
   {
     "id": "2"
     "entityType": "node"
     "childNodes": [
          ...
     ]
   }
  ]
}

为大树结构。

我想计算集合中属于objectType =“ Node”的文档和子文档的总数。

我的尝试是一次手动获取一个级别的数据:

SELECT VALUE COUNT(c.id) FROM c where CONTAINS(c.id, 'a|') and c.entityType = 'node'
SELECT VALUE COUNT(l.id) FROM c JOIN l in c.childNodes where CONTAINS(c.id, 'a|') and c.entityType = 'node'
SELECT VALUE COUNT(l2.id) FROM c JOIN l in c.childNodes JOIN l2 in l.childNodes where CONTAINS(c.id, 'a|') and c.entityType = 'node'

1 个答案:

答案 0 :(得分:0)

首先,很难找到一种平滑(直接)的方式来满足您的需求。当然,您在问题中提到的手动方式行之有效。但是,如果您有太多的JSON嵌套层,或者它是随机的,你的方式可能不合适。

我建议您递归循环结果以获取包含"entityType": "node"的对象数。例如,在cosmos db存储过程中:

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

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT c.childNodes FROM c where c.entityType = "node"',
    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 count = {count:1};
            loopChildNodes(feed,count);
            response.setBody(count);
        }
    });

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

    function loopChildNodes(array,count){
        for (var i=0;i<array.length;i++){
            console.log(count)
            if(array[i].entityType == "node"){
                count.count++;
            }
            if(array[i].childNodes!=null)
                loopChildNodes(array[i].childNodes,count)
        }
    }
}

我的测试数据:

enter image description here

输出:

enter image description here

相关问题