0

我正在學習AngularJS和Firebase,我正在玩一個簡單的ChatApp,以瞭解代碼。在Firebase規則中添加「.indexOn」:「.value」

我的火力地堡DB結構是這樣的:

"chat": { 
    "messages": { 
     "chat1": { [ list of messages ] }, 
     "chat2": { [ list of messages ] } 
    }, 
    "rooms": { 
     "chat1": { 
      "users": { 
       "user1": true, 
       "user2": true 
      } 
     }, 
     "chat2": { 
      "users": { 
       "user2": true, 
       "user3": true 
      } 
     } 
    } 
} 

由於火力地堡的保護規則,我不能添加聊天鏈接的用戶節點,比需要我必須做一個火力地堡查詢檢索聊天室用戶,在App Start Up上使用orderByChild()查詢。

使用火力地堡是簡單的比我可以使用來獲取所有聊天:

var chatLink = firebase.database().ref('chat/rooms'); 
chatLink 
    .orderByChild('users/' + userId) 
    .equalTo(true) 
    .once('value', function(chatSnap){ 

     /* Do Some Stuff Here */ 

    }); 

每一件事情的工作很好,但我收到的控制檯的警告:

火力警告:使用未指定的索引。考慮加入「.indexOn」:‘用戶/ {} userId的’於/聊天/間到您的安全規則,獲得更好的性能

搜索在網絡上,我發現,對於變量orderByChild()查詢,我可以通過用戶.indexOn: .value在我的Firebase規則。

我試圖添加此規則:

{ 
    "rules": { 
     "chat": { 
      "rooms": { 
       ".indexOn": ".value" 
      } 
     } 
    } 
} 

但我仍然收到總是警告。我該如何解決它?

非常感謝!

回答

3

索引此結構,以便有效的查詢,你必須添加一個索引爲每個用戶:

{ 
    "rules": { 
     "chat": { 
      "rooms": { 
       ".indexOn": ["users/user1", "users/user2"] 
      } 
     } 
    } 
} 

這不會是維護,因爲你可能會添加用戶動態。

像往常一樣使用NoSQL數據庫,這意味着您必須擴展/調整您的數據模型以允許使用您想要的用例。相反,查詢他們的用戶的房間,保持房間的每個用戶列表(除了當前數據):

"user_rooms": { 
    "user1": { 
    "chat1": true 
    }, 
    "user2": { 
    "chat1": true, 
    "chat2": true 
    } 
    "user3": { 
    "chat2": true 
    } 

現在你可以看一下對用戶的聊天室,甚至無需查詢。

另請參閱我在Firebase query if child of child contains a value中有關此分類問題的回答。

+0

謝謝,但如何處理「.indexOn」:「.value」這樣的規則?我讀過我可以在變量查詢中使用它,但似乎不適用於我的情況... –

+1

'.value'上的索引適用於'orderByValue '你的查詢是'orderByChild'查詢,所以它需要每個指定子的索引 –

0

我知道這可能遲了2點,但這裏有些東西可以幫助你。我一直在尋找和你一樣的信息,而在我的情況下,它讓我感到很高興。

$ usersId匹配任何子鍵。所以你必須做這樣的事情。

{ 
"rules": { 
    "chat": { 
     "rooms": { 
      "users": { 
       "$usersId": { 
        ".indexOn": ".value" 
       } 
      } 
     } 
    } 
} 

我的情況: 使用未指定的索引。考慮添加'「。indexOn「: 」日「」在消息/ -L2bPVX4_fL41H7lhexc您的安全和火力地堡數據庫規則獲得更好的性能

L2bPVX4_fL41H7lhexc ==孩子在我的NoSQL數據庫結構

解決方案:

"messages": { 
    "$messagesId": { 
    ".indexOn": "date" 
    } 
} 
+0

謝謝你的回覆!稍後我會檢查是否您的解決方案可能適用於我的數據庫規則 –

+0

讓我知道如果它幫助你:) –