如何为Firebase数据库添加索引规则?

时间:2016-08-23 04:41:02

标签: firebase firebase-realtime-database

我一直在控制台上获取firebase消息,以便在聊天规则中为用户4321添加indexOn。以下是我的数据库。

enter image description here

我在firebase中的规则就像:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "users": {
      ".indexOn": ["name", "email","uid"],
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    },
    "chats": {
      "$key": {
        ".indexOn": ["uid"] 
      }
    }
   }
}

我不确定为什么索引不起作用。我如何改进整个数据库的索引?

2 个答案:

答案 0 :(得分:6)

您当前的数据结构只允许轻松列出聊天室的所有成员,而不是相反。这可能是您收到该消息的原因,因为如果您要列出用户所属的所有聊天记录,则必须搜索所有/chats条记录。

您可能需要在/chat/<chat-id>/members/users/<uid>/groups复制聊天室成员资格数据。你的案例几乎与the Firebase guide here中的案例相同 - 特别是阅读链接部分中的代码,但最好阅读整个指南,这真的有助于我理解数据库是如何工作的。

顺便说一句:您的聊天规则:".indexOn": ["uid"]对您发布的示例数据不做任何处理。它说“按uid属性索引聊天室”,但您的聊天室内没有uid键(表示uid: 'someid',而不是'someid': true)。有关索引如何工作的详细信息,请参阅indexing guide

答案 1 :(得分:1)

有两种类型的索引orderByValue:orderByChild

使用orderByValue建立索引:

{
  "rules": {
    "scores": {
      ".indexOn": ".value"
    }
  }
}

使用orderByChild进行索引:

{
  "rules": {
    "employee": {
      ".indexOn": ["empName", "empId", "designation"]
    }
  }
}

多级索引:

{
  "rules": {
    "employee": {
      ".indexOn": ["empName","empId","branchDetails/branch",
        "branchDetails/branchLocation","branchDetails/branchId"]
    }
  }
}

对于Firebase实时数据库数据索引,您也可以参考此链接。

Firebase Real-Time Database Data Indexing