【问题标题】:How to add index rules for Firebase database?如何为 Firebase 数据库添加索引规则?
【发布时间】:2016-12-29 18:27:10
【问题描述】:

我不断在控制台上收到有关在聊天规则中为用户 4321 添加 indexOn 的 firebase 消息。下面是我的数据库。

我在 firebase 中的规则是这样的:

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

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

【问题讨论】:

  • 您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,总的来说这只是一件好事。
  • 嗨,有点不相关的问题。我正在处理类似的结构,我想查询特定用户的聊天记录。那应该是chats/CHAT_ID/USER_ID,但是因为我没有CHAT_ID,所以我不知道如何处理。你遇到过类似的问题吗?

标签: firebase firebase-realtime-database


【解决方案1】:

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

您可能需要在/chat/<chat-id>/members/users/<uid>/groups 复制聊天室成员数据。您的案例与the Firebase guide here 中的案例几乎相同——请特别阅读链接部分中代码下方的描述,但最好阅读整个指南,它确实帮助我理解了数据库的工作原理。

顺便说一句:您在聊天中的规则:".indexOn": ["uid"] 不会对您发布的示例数据做任何事情。它说“通过uid 属性索引聊天室”,但您的聊天室内部没有uid 键(意思是uid: 'someid',而不是'someid': true)。请参阅indexing guide,了解索引如何工作的更多信息。

【讨论】:

    【解决方案2】:

    有两种类型的索引orderByValue:orderByChild

    使用 orderByValue:: 建立索引

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

    JSON 树

    {
      "employee": {
        <"employee1Key">: {
          "empName": Rohit Sharma,
          "Designation": SW Developer,
          "empId": EMP776,
          "branchDetails": {
            "branch": Software,
            branchLocation: Pune,
            branchId: BR556
          }
        },
        <"employee2Key>": {
          "empName": Vira tKholi,
          "Designation": Accountant,
          "empId": EMP908,
          "branchDetails": {
            "branch": Finance,
            branchLocation: Dheli,
            branchId: BR557
          }
        },
        <"employee3Key">: {
          "empName": MS Dhoni,
          "Designation": Sales Manager,
          "empId": EMP909,
          "branchDetails": {
            "branch": Sales and Marketing,
            branchLocation: Pune,
            branchId: BR556
          }
        }
      }
    }
    

    使用 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

    【讨论】:

    • 为链接提供上下文:鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    • 感谢您的建议!!
    猜你喜欢
    • 2018-06-10
    • 2017-12-14
    • 1970-01-01
    • 2019-06-14
    • 2021-02-17
    • 2017-10-08
    • 2017-07-15
    • 2018-08-27
    • 1970-01-01
    相关资源
    最近更新 更多