Firebase实时数据库和云功能-基于数据节点的增量计数器

时间:2018-11-20 15:43:29

标签: javascript firebase firebase-realtime-database google-cloud-functions counter

我正在使用一个Web应用程序,它将可视化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 :(得分:3)

是的,您应该使用交易。请参阅此处的文档:https://firebase.google.com/docs/database/web/read-and-write#save_data_as_transactionshttps://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;
    });
  });