У меня есть данные датчика IoT, которые сохраняются в базе данных космоса. Мне нужно агрегирование данных на уровне минут за последние 30 дней для отображения в веб-приложении. Таким образом, я написал хранимую процедуру для этого, чтобы сделать группировку и совокупность данных датчиков.
выдает следующую ошибку
Не удалось выполнить хранимую процедуру для чего-либо для коллекции newData: {"code": 400, "body": "{\" code \ ": \" BadRequest \ ", \" message \ ": \" Message: {\ \ "Errors \\": [\\ "Обнаружено исключение при выполнении функции. Exception = Error: Результирующее сообщение будет слишком большим из-за \\\\" 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 / разделы / 784e5371-950b-47ddd78765d658658658658658658658658656 131850819031922581p /, 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.');
}