我将firebase用作使用react native创建的移动应用程序的数据库。在一种情况下,我需要检查孩子是否已经出现?如果不创建新子级,则更新现有子级。
我有一棵名为“ CouponUsage”的树,它包含所有使用优惠券代码的用户。
树的结构如下:
-CouponUsage
-user1
-coupon1: 0 // couponcode name and Number of times used
-user2
-coupon1: 2
-coupon2: 0
所以,我想要的是,我需要检查“ user1”或“ user2”是否已存在?如果不存在,则应使用输入的优惠券代码创建带有“ user1”或“ user2”的新条目。
整个场景是,用户将在应用程序中输入优惠券代码,我正在验证代码,然后更正后,优惠券代码将发送到google cloud功能,然后上述事情就会发生。因此,一旦用户输入了优惠券代码(每个优惠券代码都有单独的用户使用限制),则将发送该代码,并且该功能应检查“ user1”是否已经存在,如果存在,则用户输入的代码已经存在?如果存在,则只需更新计数器,否则创建“ user1”并添加“ coupon1”的子代(用户输入的优惠券),然后从1开始计数器。
这是我到目前为止在Google Cloud功能上的代码! :
if(usersCouponUsage) {
await admin.database().ref(`couponUsage/${phone}`)
.update({ [couponCodeName]: usersCouponUsage + 1 });
}
如果我也通过了计数,它将明显更新计数。如何在firebase中实现以上所说的?
答案 0 :(得分:0)
实际上很容易。由于您正在更新计数器,因此应使用Transaction,它在“将现有值修改为新值”时将“确保与其他同时写入相同位置的客户端没有冲突”。
好消息是,当用户/优惠券对不存在时,交易将自动处理该案件。
这是要包含在您的Cloud Function中的代码:
.....
const user = 'user1'; //Set the user
const coupon = 'coupon1' //Set the coupon
const couponUsageRef = admin.database().ref('CouponUsage/' + user + '/' + coupon);
return couponUsageRef.transaction(currentNbr => {
return currentNbr + 1;
});
.....
如果要在Cloud Function之外测试事务,只需将以下代码复制/粘贴到您可以在本地保存的HTML文件中,将Firebase config元素更改为您自己的元素,然后在浏览器中将其打开。 / p>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, user-scalable=yes">
<script src="https://www.gstatic.com/firebasejs/5.9.0/firebase.js"></script>
</head>
<body>
<script>
var config = {
apiKey: "--yourValue--",
authDomain: "--yourValue--",
databaseURL: "--yourValue--",
projectId: "--yourValue--"
};
firebase.initializeApp(config);
var user = 'user1';
var coupon = 'coupon2'
var db = firebase.database();
var couponUsageRef = db.ref('CouponUsage/' + user + '/' + coupon);
couponUsageRef.transaction(function(currentNbr) {
return currentNbr + 1;
});
</script>
</body>
</html>