Я не уверен, почему вы не можете вычислить среднее значение, но более простая версия вашего кода была бы:
exports.taverage = functions.database.ref('/User/tsetUser/monthQuit/{pushId}')
.onCreate((snapshot, context) => {
return admin.database().ref('/User/tsetUser/monthQuit/{pushId}').once('value')
.then(function(snapshot) {
let sum=0;
snapshot.forEach(child => {
sum = sum + child.val();
})
let avg = sum / snapshot.numChildren();
return admin.database().ref('/User/tsetUser/inform/standardQuit').set(avg);
});
});
Самые большие различия:
Этот код возвращает обещания как от верхнего уровня, так и от вложенного then()
.Это необходимо, чтобы Cloud Functions знали, когда ваш код готов, и таким образом могут прекратить выставлять вам счета (и, возможно, закрыть контейнер).
Мы просто добавляем значение каждого дочернего элемента ксумма, так как вы не использовали массив любым другим способом.Обратите внимание, что child.val()
зависит от вашей структуры данных, которой вы не поделились.Поэтому, если это не помогло, вам необходимо обновить способ получения точного значения (или поделиться с нами своей структурой данных).
Код фактически рассчитывает среднее значение путем деления суммыпо количеству дочерних узлов.
Рассмотрите возможность использования скользящего среднего
Следует помнить, что теперь вы читаете все узлы каждый раздобавляется один узел.Эта операция будет становиться все дороже по мере добавления узлов.Подумайте, можете ли вы использовать скользящее среднее, для которого не потребуются все дочерние узлы, а только текущее среднее и новый дочерний узел.Значение будет приблизительным средним, где более поздние значения обычно имеют больший вес, и их гораздо дешевле вычислить:
exports.taverage = functions.database.ref('/User/tsetUser/monthQuit/{pushId}')
.onCreate((snapshot, context) => {
return admin.database().ref('/User/tsetUser/inform/standardQuit').transaction(function(avg) {
if (!avg) avg = 0;
return (15.0 * avg + snapshot.val()) / 16.0;
});
});