Firebase技术问题:父键取子键、非遍历检查日期存在性
Firebase 数据库常见问题解答
问题1:如何从Firebase某节点的父键获取子键?
其实分两种场景,看你手里的是父节点的引用还是已经拿到了快照:
- 如果你有父节点的数据库引用,想要一次性拿到所有子键的话,不用
forEach也可以。拿到父节点的快照后,把数据转成对象,直接取对象的键数组就行:const parentRef = firebase.database().ref('your-parent-node-path'); parentRef.once('value').then(snapshot => { // 处理空节点的情况,避免Object.keys报错 const childrenData = snapshot.val() || {}; const childKeys = Object.keys(childrenData); console.log('所有子节点的键:', childKeys); }); - 要是你只是想检查某个特定子键是否存在于父节点下,直接用
snapshot.hasChild('target-child-key')就可以,不用遍历所有子节点。
问题2:无需forEach循环,检查数据库中是否存在指定日期节点
先给你指出代码里的小坑:snapshot.val()返回的是节点的具体数据,它没有key属性——节点的键是存在于快照对象本身的,也就是snapshot.key。不过回到你的核心需求,不用forEach的话,有两个更高效的方法:
直接查询目标日期节点(最优方案)
没必要拉取整个父节点的数据,直接把日期作为子路径定位到节点,然后检查是否存在:// 假设你的日期节点是父ref下的直接子节点 const targetDateRef = ref.child('2018-04-23'); targetDateRef.once('value').then(snapshot => { if (snapshot.exists()) { console.log('这个日期的节点存在!'); // 还能直接拿到该节点的数据:snapshot.val() } else { console.log('该日期节点不存在'); } });这种方式不仅不用遍历,还能减少数据传输,性能更好。
如果必须拉取父节点数据
要是因为某些原因必须获取整个父节点的数据,那可以把快照转成对象后,直接用Object.hasOwn检查键是否存在:ref.once('value').then(snapshot => { const parentData = snapshot.val() || {}; const targetDate = '2018-04-23'; if (Object.hasOwn(parentData, targetDate)) { console.log('该日期节点存在'); } else { console.log('该日期节点不存在'); } });这种方式也完全不用遍历,直接通过对象键的特性快速判断。
内容的提问来源于stack exchange,提问作者Lion Smith
相关产品推荐
相关产品推荐

