索引您的數據

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"
    }
  }
}