2016-12-14 37 views
1

如果你想保存在一個節點的多個相同類型的孩子,那麼每個孩子將有自己的唯一標識符childByAutoId將是有用的。Firebase規則來訪問特定的孩子的價值

List:{ 
KJHBJJHB:{ 
    name:List-1, 
    owner:John Doe, 
    user_id:<Fire base generated User_id> 
}, 
KhBHJBJjJ:{ 
    name:List-2, 
    owner:Jane Lannister, 
    user_id:<Fire base generated User_id> 
}, 
KhBHJZJjZ:{ 
    name:List-3, 
    owner:John Doe, 
    user_id:<Fire base generated User_id> 
} 
} 

我想用下面的代碼的幫助來訪問List

let ref = FIRDatabase.database().reference(withPath: "/List") 

當前用戶登錄到應用程序是John Doe。當用戶訪問列表時,我想要所有List孩子的主人是John Doe(即List-1 & List-3),並忽略其他子值。

我是否必須在我的應用程序中執行此操作,或者可以通過Firebase安全規則來實現嗎?

我現在的規則定義是:

"List":{ 
".read": "root.child('List/'+root.child('List').val()+'/user_id').val() === auth.uid" } 

但這個規則沒有給我任何的成功。任何想法如何實現預期的結果?

+0

您是否嘗試過使用查詢? – gasho

+0

@gasho是的,使用查詢我可以拉下整個分支,然後只保留我需要的。 但實際上我試圖從firebase本身提取所需的數據,這樣我就不必在我的應用程序端運行任何查詢。 –

回答

1

您正在嘗試使用安全規則來過濾列表。這是不可能的,也是開發人員通過SQL背景進入Firebase的常見陷阱之一。我們通常稱其爲「規則不是過濾器」,你可以瞭解更多關於它:

解決方案几乎總是相同的:保留每個用戶有權訪問的帖子鍵的單獨列表。

UserLists:{ 
    JohnUid: { 
    KJHBJJHB: true, 
    KhBHJZJjZ: true 
    }, 
    JaneUid: { 
    KhBHJBJjJ: true 
    } 
} 

這種類型的列表通常被稱爲索引,因爲它包含對實際文章的引用。您還可以在Firebase documentation on structuring data中找到關於此結構的更多信息。