Arrays 使用CosmosDB对二维结果集中的列求和
我目前正在从事一个项目,需要在CosmosDB实例(>100.000)中查询大量文档,并对values数组中的所有列求和。让我举个例子 文件: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] -----------
{
"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)抛出新错误('服务器不接受该查询');
}
输出: