【问题标题】:Firebase Realtime Database and Cloud Functions -- increment counter based on data nodesFirebase 实时数据库和云函数——基于数据节点的递增计数器
【发布时间】:2018-11-20 15:43:28
【问题描述】:

我正在开发一个网络应用程序,它将可视化我的 Firebase 数据库中的数据。但首先,我希望能够使用给定数据“统计”用户总数,以便我可以在图表中使用该计数。

作为参考,我的数据库如下所示:

因为我希望所需键的总数是单独的,所以我猜我需要为每个键分别设置单独的计数器。我已经开始编写一个云函数来跟踪新用户的创建时间:

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++
})

或者我应该考虑在这种情况下使用事务吗?我真的不确定最好的方法,非常感谢一些帮助。

【问题讨论】:

  • 创建用户时增加计数

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


【解决方案1】:

是的,您应该使用事务。请参阅此处的文档: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;
    });
  });

【讨论】:

  • 谢谢!快速提问:.ref('genderCounters/' + userData.gender) 是否假设在我的数据库中,我的students 孩子之外/之下也有一个性别计数器的孩子?
  • .ref('genderCounters/' + userData.gender) 将为根节点 genderCounters/male 创建一个计数器,并为根节点 genderCounters/female 创建一个计数器。你可以使用.ref('students/genderCounters/' + userData.gender)
  • 我明白了。如果我想在我的代码的其他部分(用于我的数据可视化)中引用这些计数器,我只需要引用计数器值,例如,genderCounters/male?
  • 是的,genderCounters/male 的值
  • @gbm0102 实际上,我的第一个版本的多计数器代码中有一个错误:我正在链接两个事务,而所有计数器的更新应在一个事务中完成!使用新代码,您将在 counters/male 节点下找到“男性”的数量。
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 2017-08-12
  • 2019-08-30
  • 2017-12-26
  • 2021-09-03
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多