2016-07-12 41 views
1

我有我的應用程序中的消息列表,我希望我的用戶檢索他們自己的消息列表。數據庫規則允許列出具有讀取權限的子項

如果我登錄爲「USER1」我可以沒有任何問題獲取/消息/ MESSAGE1,但如果我想找回我的所有消息(而不能以訪問其他用戶的消息)/messages/即使我有權訪問某些子元素,但我獲得了權限

如何在不知道消息ID的情況下爲我的用戶提供具有讀權限的所有子元素的列表?

預先感謝您。

下面是我的數據庫:

{ 
    "messages" : { 
    "message1" : { 
     "sender" : "user1_uid" 
     }, 
    "message2" : { 
     "sender" : "user1_uid" 
    } 
} 

這裏是我的原則:

{ 
    "messages": { 
     "$weddingId": { 
      ".read": "data.child('sender').val() == auth.uid" 
     } 
    } 
} 

回答

1

阿道夫有一個有效的方法。他將消息數據分散在用戶特定的節點下。這在NoSQL數據庫中非常常見,基本上構建了許多「小型消息表」而不是一個大型表。

或者,你可以保持它現在是信息的主列表,而是爲每個用戶創建的消息的所謂指標:

{ 
    "messages" : { 
    "message1" : { 
     "sender" : "user1_uid" 
     }, 
    "message2" : { 
     "sender" : "user1_uid" 
    } 
    }, 
    "user_messages": { 
    "user1_uid": { 
     "message1": true, 
     "message2": true 
    } 
    } 

你會保持安全規則messages你有他們了,但添加這些新user_messages指數:

"user_messages": { 
    "$userId":{ 
    ".read": "$userId == auth.uid" 
    } 
} 

有了這些的地方,你會首先從/user_messages/<authData.uid>加載消息ID,然後從加載各個消息加載用戶信息。

另請參閱我們的guide on creating data that scales以瞭解有關此技術的更多信息(稱爲扇出)。

2

我會建議重構,以達到你期待什麼,因爲你將無法使用.orderByChild('sender').equalTo(user_uid)因爲你沒有給予/messages分支的閱讀權限(僅適用於孩子)。

您可以將userId作爲/messages中的一個分支,並將其中的所有播放器消息標識設置爲。您將需要保存的信息數據,如波紋管:

{ 
    "messages" : { 
    "userId" : { 
     "message1" : { 
      "text": "tetet" 
     }, 
     "message2" : { 
      "text" : "tetet2" 
     } 
    }, 
    "userId2": {...} 
} 

那麼你的規則是這樣的:

{ 
    "messages": { 
     "$userId":{ 
      ".read": "$userId == auth.uid", 
      "$weddingId": { 
       //... 
      } 
    } 
} 

最後,你將能夠有一個與所有用戶的消息:

firebaseRef.child('messages').child(user_uid).once('value', function(snapshot) { 
    if (snapshot.val()){ 
     console.log(snapshot.val()); 
    } 
}) 
+0

謝謝你的回答。我應該提到「發件人」是多個用戶ID,稍後可以添加更多的發件人 - 你能想出一種方便的方法嗎? – larsd

+0

@larsd您需要簡單地將messageId添加到所有適當的用戶。 – adolfosrs

相關問題