繁体   English   中英

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

[英]Firebase Realtime Database and Cloud Functions — increment counter based on data nodes

我正在开发一个Web应用程序,可以显示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++
})

或者我应该考虑在这种情况下使用交易? 我真的不确定最好的方式,真的很感激一些帮助。

是的,您应该使用交易。 请参阅此处的文档: https//firebase.google.com/docs/database/web/read-and-write#save_data_as_transactionshttps://firebase.google.com/docs/reference/js/firebase.database.Reference #交易

要计算您可以执行的总用户数,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM