2013-06-20 43 views
13

我有以下的火力層次,一些數據被隱藏的機密性:在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,以避免大量的數據傳輸,並避免遍歷retrived數據獲取的ID?有沒有辦法直接檢索這些ID?

回答

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

哎@Kato,是有計劃shallow'加上'以SDK? –

+0

無。您是否使用無法發出HTTP請求的工具?如果這不切實際,您可以將ID列表存儲在SDK參考的sep路徑中。請參閱多路徑更新。 – Kato

5

這是一個有點老了,你可能已經知道,但如果別人走來。爲此,您可以使用REST API調用,您只需要設置參數shallow=true

這裏是documentation

+0

這是非常有用的,它在2013年6月不可用,非常感謝分享此更新! –

+0

可以用web api來完成嗎? – vinesh

+0

我不這麼認爲,他們在今年10月才推出REST – webduvet

相關問題