【问题标题】:Firebase Database Access multiple recordsFirebase 数据库访问多条记录
【发布时间】:2017-03-06 22:37:39
【问题描述】:

这是我的 Firebase 数据结构:

{
  "companies": {
    "-Ke_b8p6OBaz1VCeovAH": {
      "display_name": "First User's Company",
      "users": {
        "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin"
      }
    },
    "-Ke_cmhDaIeGJjFwsDI1": {
      "display_name": "First User's Second Company",
      "users": {
        "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin"
      }
    },
    "-Ke_b9OgwY2IBdj5szmJ": {
      "display_name": "Second User's Company",
      "users": {
        "5XcpmN7DgEWNnmWZucyQiOh4TJt2": "admin"
      }
    }
  },

  "users": {
    "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": {
      "display_name": "First User"
    },
    "5XcpmN7DgEWNnmWZucyQiOh4TJt2": {
      "display_name": "Second User"
    }
  }
}

我正在尝试对此数据进行查询(例如通过 REST):

example.firebase.com/companies.json?orderBy="users/ir7jjLPA3fXCVsdc4OzzSiH9RJd2"

我的希望是回来

{
  "-Ke_b8p6OBaz1VCeovAH": {
    "display_name": "First User's Company",
    "users": {
      "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin"
    }
  },
  "-Ke_cmhDaIeGJjFwsDI1": {
    "display_name": "First User's Second Company",
    "users": {
      "ir7jjLPA3fXCVsdc4OzzSiH9RJd2": "admin"
    }
  }
}

相反,我得到了

{
  "error": "Index not defined, add \".indexOn\": \"users/ir7jjLPA3fXCVsdc4OzzSiH9RJd2\", for path \"/companies\", to the rules"
}

这是我的 Firebase 安全规则

{
  "rules": {
    ".read": true,
    ".write": true,

    // Companies
    "companies": {
      ".indexOn": ["display_name", "users"],
    }
  }
}

为每个用户更新安全规则索引是不可行的,那么我该如何处理呢?

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    Firebase 不支持您习惯的类意义上的“过滤”。使用您当前的数据结构,您需要:

    1. 查询所有公司并在您的目标用户客户端过滤,或
    2. 重组您的用户集合以添加一个属性,指示该用户是哪些公司的管理员。然后,您可以在一个查询中获取用户记录,然后在第二个查询中查询该用户是其管理员的公司的记录。

    这些选项听起来很可怕,但不管你信不信,这就是 Firebase 被设计为“快速”处理的特殊情况。它通过大规模弥补代码/查询的低效率,因此在使用它时您需要忘记许多特定于 SQL 的最佳实践,例如规范化数据、高效的查询/连接操作等。尽管看起来像是额外的工作,如果您实际上对操作进行了基准测试(特别是如果您启用了诸如持久性/缓存之类的选项),即使使用这些额外的步骤,您也可以等于或超过 SQL 环境的性能。可以把它想象成 RISC 与 CISC,其中 RISC 是 Firebase,而 CISC 是 SQL。

    【讨论】:

    • “Firebase 不支持任何类型的过滤/搜索。”在这种情况下,这种说法似乎具有误导性。本身不是搜索,但orderBy + equalTo 是一个简单的过滤器,适用于@Cody 的问题。我不太精通 REST API,但在 SDK 中肯定可以对名为 deep querying 的孩子的孩子进行排序。
    • 我确实会改写第一句话,因为 Firebase 文档中有一个完整的部分是关于排序和过滤数据的:firebase.google.com/docs/database/web/…
    • @TravisChristian - 我读过那篇文章,以及弗兰克发布的那篇文章。但是,我无法查询我上面提到的方式。通过他们引用的深度查询,键总是相同的,即heightweight 等。我正在寻找会更改的键的查询。作为用户 uid 的键。此外,将这些 id 存储为字典中的键是 firebase 数据库中推荐的存储做法。 firebase.google.com/docs/database/web/structure-data#fanout
    • 对不起,伙计们,我看不出orderBy + equalTo 是如何解决科迪最初的问题的。 Firebase 自己的文档明确描述了来自 SQL 领域的数据结构更改以解决此类问题,我认为是时候让我们所有人承认“我如何过滤......?”是新 Firebase 开发人员的第一大问题。我不认为有“替代品”的假设正在与新开发者达成一致。 orderBy+equalTo 解决了一个特定问题……但不是每个人都在问的问题。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多