Слишком большой размер ответа хранимой процедуры в Azure Cosomos DB

У меня есть данные датчика IoT, которые хранятся в базе данных космоса. Мне нужно агрегирование данных на уровне минут за последние 30 дней для отображения в веб-приложении. Итак, я написал хранимую процедуру для этого, чтобы сделать группировку и совокупность данных датчиков.

это дает следующую ошибку

Не удалось выполнить хранимую процедуру для коллекции newData: {"code":400,"body":"{\"code\":\"BadRequest\",\"message\":\"Message: {\\"Ошибки \\":[\\" Обнаружено исключение при выполнении функции. Исключение = Ошибка: Результирующее сообщение будет слишком большим из-за \\\\"x-ms-documentdb-script-log-results\\\\". Возврат из сценария с текущим сообщением и используйте токен продолжения для повторного вызова сценария или изменения сценария. \\ r \\ n Настройка трассировки: ошибка: результирующее сообщение будет слишком большим из-за \\\\ "x-ms-documentdb-script-log -results \\\\ ". Возврат из сценария с текущим сообщением и использование токена продолжения для повторного вызова сценария или изменения сценария.\\n at validateSize (sa\\"]}\r\nActivityId: 46713736-fe18-4fd1-8df1-49fa615c7289, запросить URI: /apps/35edbe01-33d4-4189-9959-240fe985a75e/services/f3955cd0-044e-4a48-ad24-ae51a24c13b8/partitions/784e5371-950b-476d-a76581508 / 188/388 / db8 / dd-db-db-db-db-db-db-db-db-db-db-db-db-db-db-db-db-db) RequestStats: \r\nRequestStartTime: 2018-11-06T21:08:06.7386246Z, номер попыток из регионов: 1\r\n, SDK: Microsoft.Azure.Documents.Common/2.1.0.0\"}","ActivityId":"46713736-fe18-4fd1-8df1-49fa615c7289","substatus":413}

Как датчики, у которых есть данные уровня 1 секунда, для которых мне нужно найти агрегаты за 1 минуту, я не могу использовать потоковое задание Analytics в качестве пересылки, я не знаю, какие имена датчиков следует хранить в avg() .

Единственный оставленный для меня вариант - запустить хранимую процедуру и вернуть агрегаты за 1 минуту.

Я использую Javascript для хранимых процедур, и в моем вызове API я использую загрузку Java Spring. Пожалуйста, дайте мне любое предложение, как я могу преодолеть это ограничение Cosmos DB или как я могу хранить 1-минутные агрегаты в Cosmos DB, чтобы я мог получить эти записи.

ниже моя процедура, и я передаю 3 строковых параметра, таких как "давление, температура, объем" "123444" "345552"

function something(variable1 , variable2 , variable3) {


var variables = variable1.split(",");
var parameters = variable1.split(",");
var variablestrings = '' , totals = {} ;
var keys = [] , values = [] , totals = [] ;
var dataPoints = {} , results = [], k , l  , p ,i;
var resultPoints = [],value;

var collection = getContext().getCollection();

for ( var i = 0 ; i < variables.length ; i = i +1 ) {
        results[i] = {};
        results[i].variableName = variables[i] ; 
        results[i].data = [];
        variables[i] = 'r.' + variables[i];
} 

variablestrings = variables.toString() + ' , r._ts ' ; 

var queryString = 'SELECT ' + variablestrings + 'FROM root r where r._ts between  ' +  variable2 + ' AND ' + variable3 ;   

// Query documents and take 1st item.
var isAccepted = collection.queryDocuments(
    collection.getSelfLink(),
    queryString,
function (err, feed, options) {
   // console.log(feed[0]._ts);
    if (err) throw err;

    // Check the feed and if empty, set the body to 'no docs found', 
    // else take 1st element from feed
    if (!feed || !feed.length) {
        var response = getContext().getResponse();
        response.setBody('no docs found');
    }
    else {
            //console.log(feed.length);
            feed.forEach( (item, index) => { 
            //var x = JSON.parse( item ) ; 
            var d1 = new Date( item._ts ) ; 
            item['timeInMinutes'] =  d1.getFullYear() + '-' + d1.getUTCMonth() + '-' + d1.getUTCDate() + ' ' + d1.getUTCHours() + ':' + d1.getUTCMinutes() + ':00' ;
            //delete item[_ts];
            //console.log(JSON.stringify(item));
            if( ! dataPoints[ item['timeInMinutes'] ] ) {
                 dataPoints[ item['timeInMinutes'] ] = [];
                dataPoints[ item['timeInMinutes'] ].push(item);
            }
            else{
                dataPoints[ item['timeInMinutes'] ].push(item);

            }
            //arrayObjects.push( item ) ;

            }  ); 

        values  = Object.values( dataPoints ) ;
            for ( k = 0 ; k < values.length ; k = k+1){
                value = values[k] ;

                for (  l = 0 ; l < parameters.length ; l = l +1){
                    totals[ parameters[l] ]= 0;
                }

                for (  p = 0 ; p < parameters.length ; p = p +1){

                    for (  i = 0 ; i < value.length ; i = i +1 ){
                        totals[ parameters[p]] = value[i][parameters[p]] + totals[parameters[p]] ; 
                    }

                    results[p].data.push({ 'x-axis' : value[0]['timeInMinutes'] , 'y-axis' : (totals[ parameters[p] ] / value.length ) });

                }
            }
            //console.log(results[0]);
            var response = getContext().getResponse();        
            response.setBody(results);


    }
});

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

}

1 ответ

На основе предложения @Chris Anderson-MSFT в комментариях к вопросу OP.


В моем случае моя хранимая процедура, написанная на javascript, имела несколько операторов регистрации. У меня сработало простое удаление console.logs.

Другие вопросы по тегам