在Firebase响应中获取Firebase子节点的名称而不会让他们的孩子也这样做?

时间:2013-06-20 10:54:16

标签: javascript performance firebase

我在firebase上有以下层次结构,隐藏了一些数据以保密:

enter image description here

我正在尝试获取视频ID列表(红色下划线)

我只能获取所有节点,然后检测它们的名称并将它们存储在一个数组中! 但这会导致低性能;因为来自firebase的dataSnapshot在我的情况下是非常大的,所以我想避免检索所有节点的内容然后循环它们以获取ID,我只需要检索ID,即没有它们的嵌套元素。

这是我的代码:

new Firebase("https://PRIVATE_NAME.firebaseio.com/videos/").once(
    'value', 
    function(dataSnapshot){ 

        // dataSnapshot now contains all the videos ids, lines & links
        // this causes many performance issues

        // Then I need to loop over all elements to extract ids !
        var videoIdIndex = 0;
        var videoIds = new Array();

        dataSnapshot.forEach(
            function(childSnapshot) {
                videoIds[videoIdIndex++] = childSnapshot.name();
            }
        );

    }
);

我如何只检索ID以避免大量数据传输并避免循环使用重新获取的数据来获取ID?有没有办法直接检索这些ID?

2 个答案:

答案 0 :(得分:10)

更新:REST API中现在有一个shallow命令,它只获取路径的键。这还没有添加到SDK中。

在Firebase中,如果不检索下面的数据,则无法获取节点名称列表。反正还没有。性能问题可以通过规范化来解决。

基本上,您的目标是将数据拆分为可消耗的块。存储您的视频密钥列表,可以在一个路径中使用标题等几个元字段,并将批量内容存储在其他位置。例如:

/video_meta/id/link, title, ...
/video_lines/id/...

要了解有关非规范化的详情,请查看此文章:https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

答案 1 :(得分:5)

它有点老了,你可能已经知道了,但万一有其他人出现。您可以使用REST api调用执行此操作,只需设置参数shallow=true

这是documentation