База данных Firebase Realtime и облачные функции - счетчик приращений на основе узлов данных - PullRequest
0 голосов
/ 20 ноября 2018

Я работаю над веб-приложением, которое будет визуализировать данные из моей базы данных Firebase.Но сначала я хочу иметь возможность «подсчитать» общее количество пользователей с заданными данными, чтобы затем использовать это число в своих графиках.

Для справки, моя база данных выглядит следующим образом:

enter image description here

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

import * as functions from 'firebase-functions'
export const onMessageCreate = functions.database
.ref('/students/{studentID}')
.onCreate((snapshot, context) => {
    const userData = snapshot.val()

    const afterGrad = userData.afterGrad
    const gender = userData.gender
    const gradDate = userData.gradDate
    const program = userData.program
    const race = userData.race
    const timeToComplete = userData.timeToComplete
})

Но сейчас я чрезвычайно растерялся из-за того, как мне следует создавать счетчики.Будет ли что-то вроде этого достаточно, с индивидуальным счетчиком для каждой константы?

import * as functions from 'firebase-functions'
var counterAfterGrad; 

export const onMessageCreate = functions.database
.ref('/students/{studentID}')
.onCreate((snapshot, context) => {
    const userData = snapshot.val()
    const afterGrad = userData.afterGrad
    var counterAfterGrad++
})

Или я должен подумать об использовании транзакции в этом случае?Я действительно не уверен в лучшем способе и был бы очень признателен за помощь.

1 Ответ

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

Да, вы должны использовать транзакцию.См. Документацию здесь: https://firebase.google.com/docs/database/web/read-and-write#save_data_as_transactions и https://firebase.google.com/docs/reference/js/firebase.database.Reference#transaction

Для подсчета общего числа пользователей вы можете сделать следующее:

export const onMessageCreate = functions.database
.ref('/students/{studentID}')
.onCreate((snapshot, context) => {
    const userData = snapshot.val()
    const afterGrad = userData.afterGrad

    const allUsersCounterRef = admin
      .database()
      .ref('allUsersCounter');

    return allUsersCounterRef
      .transaction(counter_value => {
        return (counter_value || 0) + 1;
      })

})

Обратите внимание, что вам, возможно, придется принятьПринимая во внимание удаление пользователя.

Вы могли бы иметь несколько счетчиков, например, "пол" (мужчина / женщина) и "программа".Затем вы будете использовать объект в транзакции следующим образом:

exports.onMessageCreate = functions.database
  .ref('/students/{studentID}')
  .onCreate((snapshot, context) => {
    const userData = snapshot.val();

    const countersRef = admin.database().ref('counters');

    return countersRef.transaction(currentData => {
       currentData[userData.gender] = (currentData[userData.gender] || 0) + 1;
       currentData[userData.program] = (currentData[userData.program] || 0) + 1;
       return currentData;
    });
  });
...