[英]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_transactions和https://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.