【问题标题】:How to define index in firebase realtime db rules?如何在firebase实时数据库规则中定义索引?
【发布时间】:2021-04-09 08:32:44
【问题描述】:

我想阅读所有的chatid。如下图所示。

我有以下查询:

firebase.database().ref("Messages/" + suid).orderByChild("chattingid").on("child_added", data => {
            data.forEach(snapshot => {
                console.log("You are here to see " + snapshot.val().chatid);
            })
})

我的控制台出现错误:

Error: No index defined for chattingid

我当前的 firebase 索引规则。

"Messages": {
          ".indexOn": "chattingid"
}

如何在 Firebase 控制台中定义索引?这样我就不会像上面提到的那样出错。谢谢

【问题讨论】:

  • 欢迎来到 Stack Overflow .. 阅读它可以帮助你:firebase.google.com/docs/database/security/indexing-data
  • 感谢分享我已经读过它,我已经尝试了很多次但仍然无法弄清楚如何去做我只想得到所有的chatid,如图所示。
  • @KevinM.Mansour 没有帮助。你通过谷歌搜索的建议。一天前我已经这样做了。
  • 试图提供帮助 :) .. 我没有谷歌 .. 我只是在 Stack Overflow 中寻找可以帮助你的答案.. 正如@FrankvanPuffelen 在他的回答中观察到一些关于索引的事情.. 抱歉浪费你的时间我试图帮助:)

标签: javascript firebase firebase-realtime-database


【解决方案1】:

要记录给定用户的所有 chatid 值:

firebase.database().ref("Messages/" + suid).on("value", data => {
  data.forEach(userBSnapshot => {
    userBSnapshot.child("chattingid").forEach(messageSnapshot => {
      console.log("You are here to see " + messageSnapshot.val().chatid);
    })
  })
})

所以变化是:

  • 我删除了 orderBy 调用,因为这里不需要排序/过滤。
  • 我监听一个“值”事件,这使得代码更容易推理。
  • 这也意味着我们需要在回调函数中增加一个循环。
  • 我们循环遍历 chattingid 快照的子节点。

注意事项:

  • 这仍然会读取所有chat 节点,因为无法读取每个节点的一部分。如果您的 chat 节点很大,请考虑创建顶级树:一个带有 chattingid 子节点,一个带有 chat 子节点。另请参阅 data structuring 上的 Firebase 文档。

要消除有关缺少索引的错误,请将索引定义为:

{
  "rules": {
    ...
    "messages": {
      ".indexOn": "chattingid/chatid"
    }
  }
}

【讨论】:

  • 感谢 Puff 的详细回答。我将为 chattingid 创建顶级树/节点。但我仍然不知道为什么我的查询未定义。
  • 什么是“您的查询”?
  • 我正在使用您的答案查询。我在我的控制台上看到。您在这里看到未定义(x2 次),因为我在 suid 中有两个 chatid,如我的图像所示。
  • 据我所知,我的答案中的代码应该可以工作。如果它不适合您,请编辑您的问题以显示您对它做了什么 - 以及您遇到了什么错误。
猜你喜欢
  • 2021-02-17
  • 2021-01-31
  • 1970-01-01
  • 2016-12-29
  • 2017-12-14
  • 2020-11-25
相关资源
最近更新 更多