Swift中查询Firebase自动ID节点下usedBy内的userid是否存在
解决Firebase优惠码重复使用检查问题
问题分析
你当前的数据库结构中,usedBy 下是自动生成的ID节点,每个节点存储用户ID。直接用 queryEqual(toValue: userid) 无法正确查询,因为缺少对节点值的排序指定。
方案一:调整查询代码
在查询前先调用 queryOrderedByValue(),让Firebase按节点值排序后再匹配:
promoCodes.child(code).child("usedBy") .queryOrderedByValue() .queryEqual(toValue: userid) .observeSingleEvent(of: .value) { snapshot in if snapshot.exists() { // 用户已使用过该优惠码 print("优惠码已被使用") } else { // 用户未使用过,可以使用 print("优惠码可使用") } }
方案二:优化数据库结构(更高效)
把 usedBy 的结构改成以用户ID作为节点键,值设为 true,这样不需要查询,直接判断节点是否存在即可,性能更好:
promoCodes - 优惠码ID - usedBy - 用户ID1: true - 用户ID2: true
对应的Swift代码:
promoCodes.child(code).child("usedBy").child(userid).observeSingleEvent(of: .value) { snapshot in if snapshot.exists() { print("优惠码已被使用") } else { // 标记用户使用优惠码 promoCodes.child(code).child("usedBy").child(userid).setValue(true) print("优惠码使用成功") } }
内容的提问来源于stack exchange,提问作者tHatpart
相关产品推荐
相关产品推荐

