Firebase按手机号全域查询教师预约日程数据失败求助
问题分析与解决方案
你的问题出在Firebase实时数据库的查询逻辑上——orderByChild("Phone")只能在当前节点的直接子节点中寻找包含Phone字段的数据。而你的数据结构里,Phone字段嵌套在/user1/[日期]/[时段]层级下,/user1的直接子节点是日期节点(比如28-07-2022),这些日期节点本身并没有Phone字段,所以直接在/user1下查询自然返回null。
方案1:重构数据库结构(推荐)
NoSQL数据库的核心是为查询场景优化结构,你可以调整数据存储方式,比如新增一个按手机号聚合的节点:
user_appointments "+7 999 999 99 99" "28-07-2022_10-00" Comment: "DemoTest" Free: false Name: "Jack" Time: "10-00" Date: "28-07-2022"
或者采用更扁平的通用预约节点:
appointments "appointment_001" Phone: "+7 999 999 99 99" Date: "28-07-2022" Time: "10-00" Comment: "DemoTest" Free: false Name: "Jack"
调整后,你要么直接通过user_appointments/+7 999 999 99 99获取该用户所有预约,要么在appointments节点执行orderByChild("Phone").equalTo('+7 999 999 99 99'),查询效率会大幅提升。
方案2:遍历日期节点查询(临时过渡用)
如果暂时无法修改数据库结构,只能遍历/user1下的所有日期节点,逐个查询匹配手机号的时段:
const ref = db.ref("/user1/"); ref.on("value", function(dateSnapshot) { const userAppointments = {}; dateSnapshot.forEach(function(dateNode) { const date = dateNode.key; // 对单个日期节点执行手机号匹配查询 dateNode.ref.orderByChild("Phone").equalTo('+7 999 999 99 99').on("value", function(timeSnapshot) { if (timeSnapshot.exists()) { userAppointments[date] = timeSnapshot.val(); } }); }); console.log("用户所有预约记录:", userAppointments); });
注意:这种方法会读取/user1下的所有日期数据,数据量越大性能越差,仅适合临时过渡使用。
内容的提问来源于stack exchange,提问作者Romanus
相关产品推荐
相关产品推荐

