Firebase 允許您使用任意子鍵對數據進行臨時查詢。如果您事先知道您的索引是什麼,您可以通過 Firebase 實時數據庫安全規則中的.indexOn
規則定義它們以提高查詢性能。
定義數據索引
Firebase 提供了用於排序和查詢數據的強大工具。具體來說,Firebase 允許您使用任何公共子鍵對節點集合進行臨時查詢。隨著應用程序的增長,此查詢的性能會下降。但是,如果您告訴 Firebase 您將要查詢的鍵,Firebase 將在服務器上為這些鍵編制索引,從而提高查詢的性能。
使用 orderByChild 建立索引
解釋這一點的最簡單方法是通過示例。 Firebase 的所有人都認為恐龍非常酷。這是恐龍事實示例數據庫中的一個片段。我們將用它來解釋.indexOn
如何與orderByChild()
一起工作。
{ "lambeosaurus": { "height" : 2.1, "length" : 12.5, "weight": 5000 }, "stegosaurus": { "height" : 4, "length" : 9, "weight" : 2500 } }
讓我們想像一下,在我們的應用程序中,我們經常需要按名稱、高度和長度對恐龍進行排序,而不是按重量排序。我們可以通過將此信息告知 Firebase 來提高查詢的性能。由於恐龍的名稱只是鍵,Firebase 已經針對恐龍名稱的查詢進行了優化,因為這是記錄的鍵。我們也可以使用.indexOn
告訴 Firebase 優化對高度和長度的查詢:
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }
與其他規則一樣,您可以在規則的任何級別指定.indexOn
規則。我們將它放在上面示例的根級別,因為所有恐龍數據都存儲在數據庫的根目錄中。
使用 orderByValue 進行索引
在此示例中,我們將演示.indexOn
如何與orderByValue()
一起使用。假設我們正在使用以下數據製作恐龍運動分數排行榜:
{ "scores": { "bruhathkayosaurus" : 55, "lambeosaurus" : 21, "linhenykus" : 80, "pterodactyl" : 93, "stegosaurus" : 5, "triceratops" : 22 } }
由於我們使用 orderByValue() 來創建排行榜,我們可以通過在/scores
節點添加.value
規則來優化我們的查詢:
{ "rules": { "scores": { ".indexOn": ".value" } } }