Arrays 使用CosmosDB对二维结果集中的列求和

Arrays 使用CosmosDB对二维结果集中的列求和,arrays,azure-cosmosdb,azure-cosmosdb-sqlapi,Arrays,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我目前正在从事一个项目,需要在CosmosDB实例(>100.000)中查询大量文档,并对values数组中的所有列求和。让我举个例子 文件: { "id": "1234", "values": [ 10, 12, 18, 12 ] }, { "id": "5678", "values": [ 12, 10, 9, 14 ] } 结果应该是值数组中所有列的数组,如下所示: [10, 12, 18, 12] [12, 10, 9, 14] -----------

我目前正在从事一个项目,需要在CosmosDB实例(>100.000)中查询大量文档,并对values数组中的所有列求和。让我举个例子

文件:

{
    "id": "1234",
    "values": [ 10, 12, 18, 12 ]
},
{
    "id": "5678",
    "values": [ 12, 10, 9, 14 ]
}
结果应该是值数组中所有列的数组,如下所示:

[10, 12, 18, 12]
[12, 10,  9, 14]
---------------
[22, 22, 27, 26]
目前我只有以下解决方案:

SELECT SUM(c.values[0]) as v1, SUM(c.values[1]) as v2, SUM(c.values[2]) as v3, SUM(c.values[3]) as v4 FROM c
但问题是values数组是一个包含100个值的数组,所以查询变得非常不可读


知道如何以更优雅的方式解决这个问题吗?

我能想到的更优雅的方式是在cosmos db存储过程中编写逻辑代码

SP代码:

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

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT v as item FROM c join v in c.values',
    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 array = [0,0,0,0];
            var count = 0;
            for(var i=0;i<feed.length;i++){                
                if(count>3)
                    count = 0;
                array[count] = array[count] + feed[i].item;
                count++;
            }
            response.setBody(array);
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
函数示例(测试){
var collection=getContext().getCollection();
var isAccepted=collection.queryDocuments(
collection.getSelfLink(),
'从c中选择v作为项目在c.values中连接v',
功能(错误、馈送、选项){
如果(错误)抛出错误;
如果(!feed | |!feed.length){
var response=getContext().getResponse();
响应。setBody(“未找到文件”);
}
否则{
var response=getContext().getResponse();
变量数组=[0,0,0,0];
var计数=0;
对于(var i=0;i3)
计数=0;
数组[count]=数组[count]+提要[i]。项;
计数++;
}
响应。体(阵列);
}
});
如果(!isAccepted)抛出新错误('服务器不接受该查询');
}
输出: