2016-01-16 158 views
0

檢索數據我有一個火力點如下 -火力地堡的關鍵

providers 
    -userid1 
    --userid : userid1 
    --keywords 
    ---key1 : true 
    ---key2 : true 
    ---key3 : true 
    -userid2 
    --userid : userid2 
    --keywords 
    ---key1 : true 
    ---key4 : true 
    ---key5 : true 

我想檢索所有那些在他們的關鍵字子「KEY1」的用戶ID。

我嘗試下面的查詢

var ref = new Firebase(url+"/providers") 
ref.orderByChild("keywords").equalTo("key1").on("value", function(snapshot){ 
console.log(snapshot.numChildren()); 
}) 

也試過 -

var ref = new Firebase(url+"/providers") 
ref.orderByKey().equalTo("key1").on("value", function(snapshot){ 
console.log(snapshot.numChildren()); 
}) 

我沒有得到任何結果。我在查詢中缺少什麼? 上述兩個查詢有什麼不同?這兩個查詢都不起作用。

回答

0

您的key1是關鍵,而equalTo()用於檢查值。

關鍵是要查詢他們key1關鍵有true值記錄:

var ref = new Firebase(url+"/providers") 
ref.orderByChild("keywords/key1").equalTo(true).on("value", function(snapshot){ 
    console.log(snapshot.numChildren()); 
}) 

不要忘記在keywords/key1等添加索引到你的rules.json:

"providers": { 
    "$uid": { 
    ".indexOn": ["keywords/key1", "keywords/key2", "keywords/key3", "keywords/key4", "keywords/key5"] 
    } 
} 

您可能會發現添加這樣的索引是不可維護的,這很好地表明您的數據結構應該得到改進。

providers 
    userid1 
    userid : userid1 
    keywords 
     key1 : true 
     key2 : true 
     key3 : true 
    userid2 
    userid : userid2 
    keywords 
     key1 : true 
     key4 : true 
     key5 : true 
providers_by_keyword: 
    key1: 
    userid1: true 
    userid2: true 
    key2: 
    userid1: true 
    key3: 
    userid1: true 
    key4: 
    userid2: true 
    key5: 
    userid2: true 

現在你可以不用查詢執行兩種操作:

  1. 在這種情況下,可以通過添加從每一個具體的按鍵映射回匹配供應商的輔助,倒排索引來完成得到所有關鍵字user1ref.child('users/user1/keywords').on(...
  2. 得到所有用戶key1ref.parent().child('providers_by_keyword/key1').on(...

這種創建二級索引的方法在NoSQL數據庫中稱爲非規範化。它在Firebase's denormalizing is normal blog post中有描述。我也推薦閱讀這個article about NoSQL data modeling

+0

謝謝弗蘭克。很好的回答,我在索引上仍然有點模糊。此查詢對我有用 ref.orderByChild(「key1」)。on(「value」,function(s){console.log(s.val()); }); 是的,你說得對,我可以保持倒排索引。 – Nikhil

+1

有趣的解決方案。但是當你開始保護數據時,你會遇到問題。或者當應用程序獲得更多用戶時(並且查詢變得更慢)。非規範化是要走的路:花一些時間閱讀我鏈接的文章,並嘗試將實踐內容放在那裏。 –