如何仅获取Firebase Realtime Database中的学生名称而非完整数据?
如何高效获取Firebase Realtime Database中的学生名称列表
问题背景
Firebase Realtime Database的students节点数据结构如下:
{ "Mike": { "Time 2022-08-22 09:04:57": { "Courses": [ "Maths", "Chemistry", "Science" ] }, "Time 2022-08-15 09:05:58": { "Courses": [ "Physics", "Geography", "Literature" ] }, "Time 2022-08-15 09:06:59": { "Courses": [ "Computer Science", "Biology", "Chemistry" ] } }, "John": { "Time 2022-08-22 10:04:57": { "Courses": [ "Maths", "Chemistry", "Science" ] }, "Time 2022-08-15 10:05:58": { "Courses": [ "Physics", "Geography", "Literature" ] }, "Time 2022-08-15 10:06:59": { "Data": [ "Computer Science", "Biology", "Chemistry" ] }, "Time 2022-08-15 10:07:59": { "Courses": [ "Computer Science", "Biology", "Physics" ] } }, "Steve": { "Time 2022-08-22 11:01:57": { "Courses": [ "Maths", "Chemistry", "Science" ] } } }
需要仅获取学生名称列表,预期结果:
["Mike", "John", "Steve"]
当前实现会拉取所有学生的完整数据再遍历提取,效率低下:
<script src="https://www.gstatic.com/firebasejs/3.2.0/firebase.js"></script> <script> var config = {}; firebase.initializeApp(config); var records = []; var ref = firebase.database().ref("students") ref.on('value', function(snapshot) { var records = snapshot.val(); for(var key in records) { records.push({ user: key }); } }); </script>
需要让Firebase直接返回学生名称,避免冗余数据传输。
高效解决方案
利用Firebase Realtime Database的shallow参数,可仅获取节点的键名,无需拉取子节点数据。修改代码如下:
<script src="https://www.gstatic.com/firebasejs/3.2.0/firebase.js"></script> <script> var config = {}; firebase.initializeApp(config); var studentNames = []; var ref = firebase.database().ref("students"); // 仅获取键名,不加载子节点数据 ref.orderByKey().once('value', function(snapshot) { studentNames = Object.keys(snapshot.val()); console.log(studentNames); // 输出 ["Mike", "John", "Steve"] }, { shallow: true }); </script>
核心要点:
{ shallow: true }选项会让Firebase只返回students节点下的所有键(即学生名称),不会传输每个学生的课程等子数据,大幅降低数据量。- 通过
Object.keys()可直接将返回的键对象转换为目标数组。 - 若需实时监听学生名称的新增/删除,将
once替换为on即可,同样保留shallow参数。
注:当前使用的Firebase 3.2.0版本已支持shallow参数,可正常使用;若条件允许,建议升级到最新稳定版以获得更多功能和安全更新。
内容的提问来源于stack exchange,提问作者StormTrooper
相关产品推荐
相关产品推荐

