2016-08-30 69 views
3

我已經開始測試Firebase,但我無法弄清楚有關索引的一件事。我正在根據我讀過的內容創建一個結構 - Firebase Data Structuring - 類似於用戶和組的示例。 JSON樹看起來是這樣的:Firebase .indexOn動態密鑰

{ 
    "babies" : { 
    "-KQSVCXI-ZMz_lQ_Q906" : { 
     "name" : "Baby", 
     "parents" : { 
     "F0o8Gr5GC2SrakUYZpC20efcmk63" : true 
     } 
    }, 
    "-KQSf4t9XQC3LnbsxLYS" : { 
     "name" : "Name2", 
     "parents" : { 
     "S6aO6Dx4lgg6anW9S9hu7EJrhVg1" : true 
     } 
    } 
    } 
} 

,我試圖讓嬰兒的父母 - 就像有在小組成員的火力地堡的例子。我做的是,在iOS的應用程序使用:

self.babiesReference 
       .queryOrderedByChild("parents/\(user.uid)") 
       .queryEqualToValue(true) 
       .observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

       // Print value 
       print(snapshot.value) 

      } 

其中user.uid是當前用戶的ID。這工作正常,但唯一的問題仍然是這樣的:

使用未指定的索引。考慮加入「.indexOn」: ‘父母/ S6aO6Dx4lgg6anW9S9hu7EJrhVg1’在/嬰兒安全 規則獲得更好的性能

如何指數用戶的ID呈現這種‘動態’的孩子呢?有沒有辦法做到這一點,或者我必須改變樹結構嗎?

謝謝。

+0

安全規則允許帶變量的動態密鑰。我不確定索引是否也支持這些,但值得嘗試。請參閱https://firebase.google.com/docs/database/security/user-security。規則在/ users/$ user_id上強制實施,以保護下面的任何關鍵字/用戶。 –

回答

2

對於這種類型的查詢(以及通常當您需要動態添加索引時),您可能需要設置倒排索引。你的情況:

{ 
    "babies" : { 
    "-KQSVCXI-ZMz_lQ_Q906" : { 
     "name" : "Baby", 
     "parents" : { 
     "F0o8Gr5GC2SrakUYZpC20efcmk63" : true 
     } 
    }, 
    "-KQSf4t9XQC3LnbsxLYS" : { 
     "name" : "Name2", 
     "parents" : { 
     "S6aO6Dx4lgg6anW9S9hu7EJrhVg1" : true 
     } 
    } 
    }, 
    "parents": { 
    "F0o8Gr5GC2SrakUYZpC20efcmk63": { 
     "babies": { 
     "-KQSVCXI-ZMz_lQ_Q906": true 
     } 
    }, 
    "S6aO6Dx4lgg6anW9S9hu7EJrhVg1": { 
     "babies": { 
     "-KQSf4t9XQC3LnbsxLYS": true 
     } 
    } 
    } 
} 

這種類型的雙向連接的是火力地堡相當普遍(在許多類似NoSQL數據庫)。

+0

好的,謝謝你。但是,在這種情況下,我如何設置「.indexOn」? – jovanjovanovic

+0

由於您只在這裏訪問密鑰,因此不需要自定義索引(密鑰會自動編入索引)。如果您仍然收到關於缺少具有上述結構的索引的警告,請顯示您的查詢代碼和您收到的警告。 –

+0

謝謝弗蘭克。我仍然要測試這一點,但我相信這是使其工作的唯一正確方法。歡呼 – jovanjovanovic