Как получить среднее значение из базы данных Firebase в реальном времени - PullRequest
0 голосов
/ 12 ноября 2018

Мой вопрос касается получения среднего рейтинга из базы данных и последующего обновления среднего рейтинга каждый раз, когда добавляется строка. Это структура моей базы данных в firebase. Firebase Real-time Database structure

Я пытаюсь получить среднюю оценку каждого идентификатора (например, 299536) и обновлять ее каждый раз, когда новые данные / строки добавляются для того же идентификатора. Я использую базу данных Firebase Realtime. Любая помощь приветствуется. Я использую response.js. Должен ли я создать действие для этого?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

Я бы порекомендовал абстрагировать эту логику от вашей клиентской стороны, так как у вас могут быть другие приложения, и если оставить открытым avgRating для обновления, это не сделает его достойным доверия. Вы можете использовать триггер облачной функции для каждого рейтинга, который вы создали, и запустить свою логику там в доверенной среде, а также пересчитать и обновить свой avgRating Здесь находится страница из документов , объясняющая создание функции

exports.calculateAvgRating = functions.database.ref('/moveinfo/{moveId}/{rating}')
    .onCreate((snapshot, context) => {
        // LOGIC GOES HERE e.g.
        // Get a list of all your ratings
        // Get average rating
        // Update avgRating
    }
0 голосов
/ 31 мая 2019

Вы можете использовать облачную функцию, чтобы сделать это. Давайте используем onCreate слушатель, чтобы усреднить общее количество каждый раз, когда есть запись.

export const ratingAvg = functions.database
 .ref("ratings/{userId}/{recordId}")
 .onCreate(async (snapshot, context) => {
 const data = snapshot.val(); // rating obj (user, userPhoto, date, comment?, rating)
 const userId = context.params.userId; // this is your userId
 const transactionId = context.params.transactionId; // the uid of the record

 const profileAvg = await admin
  .database()
  .ref(`ratings/${userId}/`)
  .once("value");

  //' if avgRating exists average with new rating else use new rating.
  const newAvg = profileAvg.val().avgRating
  ? ((profileAvg.val().avgRating + data.rating) / 2).toFixed(2)
  : data.rating; 

  // write new average
  return admin
   .database()
   .ref(`ratings/${userId}/`)
   .update({
     avgRating: newAvg
   })
   .then(res => {
     console.log(res);
   })
   .catch(err => {
     console.log(err);
   });
 });
0 голосов
/ 12 ноября 2018

Если я правильно понял ваш вопрос - примерно так:

database.ref(`movieinfo/${movieId}/avgRating`)
  .once('value')
  .then((snapshot) => {
    const val = snapshot.val();
    console.log(val);
  })
  .catch((e) => {
    console.log('Error fetching data', e);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...