我正在使用一个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++
})
还是在这种情况下我应该考虑使用事务?我真的不确定最好的方法,也希望得到一些帮助。
答案 0 :(得分:3)
是的,您应该使用交易。请参阅此处的文档: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;
});
});