Я хочу получить средние данные моей базы - PullRequest
0 голосов
/ 30 марта 2019

Я хочу усреднить связанные значения при обновлении данных в FireBase.

Я использую функции Firebase и не могу загрузить данные.Я могу изменить данные, которые я хочу, когда происходит событие, но я не могу вычислить среднее значение данных.

exports.taverage = functions.database.ref('/User/tsetUser/monthQuit/{pushId}')
    .onCreate((snapshot, context) => {
        const promiseRoomUserList = admin.database().ref('/User/tsetUser/monthQuit/{pushId}').once('value');
        var sum=0;
        const arrayTime = [];
            snapshot.forEach(snapshot => {
               arrayTime.push('/User/tsetUser/monthQuit/{pushId}'.val());
            })
        for(let i=0; i<arrayTime.length; i++){
            sum+=arrayTime[i];
        }
        return admin.database().ref('/User/tsetUser/inform/standardQuit').set(sum);
    });

// Я хочу значение 'standardQuit', установленное среднее значение.

1 Ответ

0 голосов
/ 30 марта 2019

Я не уверен, почему вы не можете вычислить среднее значение, но более простая версия вашего кода была бы:

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;
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...