2012-07-20 104 views
46

有沒有一種使用Firebase執行數據庫式查詢的快速方法?使用Firebase的數據庫式查詢

例如:

給定火力參考users與領域user_idnameage,什麼是做一個類似的查詢的最佳方式:

SELECT name FROM users WHERE `user_id`=147; 

SELECT COUNT(*) FROM users WHERE age=21; 

回答

70

一般來說,沒有。 Firebase本質上是一個「實時數據庫」,隨着數據更改不斷向您發送更新,因此執行通用查詢更加困難。現在,有一些(被公認是有限的)查詢提供的基元。請參閱文檔中的Queries/Limits頁面。

您可以經常解決這些限制,通過各種途徑:

  • 使用位置名稱和優先級智能。如果您將數據構建爲/ users/[userid]/name,則只需檢索/ users/147/name即可完成您的第一個「查詢」。如果您知道您希望按年齡進行查詢,則可以將年齡用作用戶節點的優先級,然後執行「usersRef.startAt(21).endAt(21).on('child_added',...)」以讓所有用戶年齡爲21歲。您仍然必須手動計數。
  • 做客戶端查詢。如果整個數據集很小,您可能能夠檢索整個數據集,然後在客戶端上手動過濾/處理它。
  • 運行單獨的服務器。它可以連接到Firebase,同步數據,然後回答客戶的「查詢」。它仍然可以通過Firebase與客戶進行溝通,並且Firebase仍然可以成爲主要的數據存儲,但您的單獨服務器可以快速執行查詢。

隨着時間的推移,我們打算對此進行改進,因爲我們認識到這是一個弱點,與傳統關係數據庫系統提供的靈活查詢相比。

+1

邁克爾過濾它,你的球隊取得與查詢任何新的進展? – 2013-04-21 16:40:23

+3

沒有值得注意的新功能。您可能對我們最近推出的這篇博客文章感興趣,因爲我們不支持類似於SQL的查詢:https://www.firebase.com/blog/2013- 04-12-denormalizing-is-normal.html – 2013-04-21 20:30:59

+3

現在有一篇博客文章和一個新的「作爲單獨服務器運行」的方法,展示瞭如何將ElasticSearch:https:// www。 firebase.com/blog/2014-01-02-queries-part-two.html – Kato 2014-01-15 23:22:47

24

萊恩鮑爾先生當然是Firebase的所有事情的主人,所以聽他說。 ;)但是,這個特定的話題是我現在已經工作了幾個星期的話題。

這裏有一些我的想法,提升「運行在單獨的服務器」和「客戶端查詢」迴應:

ElasticSearch(使Node.js腳本)

隨着服務器上的node.js腳本,您可以集成ElasticSearch並在一小時內提供一些穩定的內容搜索。這裏有一個博客帖子和一個lib,使得它更容易:https://www.firebase.com/blog/2014-01-02-queries-part-two.html

緩存/常用查詢

這些可以通過一臺服務器/ cron進程讀取表,並複製其中的數據進行處理。例如,假設我想在註冊期間爲用戶的登錄名顯示「不可用/可用」,但出於某種複雜的原因,用不同的唯一ID存儲用戶記錄。

我的cron /服務器可以從users表中讀取所有記錄,然後將它們插入到通過電子郵件地址存儲的另一個表中,並將其用戶的記錄ID(或者我想知道的任何其他數據) 。

這種重複的數據方法是對手動緩存技術進行排序並且是無SQL環境中的常見做法;我們正在交易存儲空間(推測其價格便宜且可用),以提高速度和簡化流程。

定製查詢(使用隊列)

自定義查詢可以通過XHR(阿賈克斯)直接到服務器,它可以做苦役,並返回更好的結果發送。或者,您可以利用Firebase利用隊列連接服務器後端。

客戶端將查詢請求作爲JSON放入名爲queue的特殊Firebase表中並等待響應。

服務器偵聽queue.on('child_added', ...),供應回用`queue_record.child數據(這裏「響應」,......數據......)

這有一些不錯的優勢。首先,任何數量的服務器都可以監聽並提供響應,從而輕鬆實現負載平衡。這個代碼非常簡單,在SO中設置和covered in another thread

希望這有幫助!

+1

現在還有一個用於集成ElasticSearch的lib,這非常容易,並且使得搜索變得非常容易,但代價是node.js腳本:https://www.firebase.com/blog/2014-01-02-queries-part-two.html – Kato 2014-01-15 23:21:34

2

我創建火力點數據表,所以當創建了自己的CMS的火力點我本

var child = ref.child(); 
var compare; 
switch(filter){ 
      case "First_Name": 
      compare = child.First_Name; 
      break; 
      case "Last_Name": 
      compare = child.Last_Name; 
      break; 
      case "Phone_Number": 
      compare = child.Phone_Number; 
      break; 
      case "Department_Number": 
      compare = child.Department_Number; 
      break; 
      case "Position": 
      compare = child.Position; 
      break; 
      case "Status": 
      compare = child.Status; 
      break; 
      case "Tier": 
      compare = child.Tier; 
      break; 
     } 


     if(compare.match("^" + string)){ 
     //display items 
+0

這就是Lehenbauer所說的「客戶端查詢」的含義。我建議使用這個等價物,但更多可讀的形式:'if(child [filter] .match('^'+ string)){'(代替從第二行開始的所有內容) – Jonathan 2015-10-24 10:55:17