Firebase数据库访问多个记录

时间:2017-03-06 22:37:40

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

这是我的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"],
    }
  }
}

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

1 个答案:

答案 0 :(得分:1)

Firebase不支持"过滤"在课堂意义上你习惯了。使用您当前的数据结构,您需要:

  1. 查询所有公司并过滤目标用户客户端或
  2. 重新构建您的用户集合,以添加一个属性,指示用户所管理的公司。然后,您可以在一个查询中获取用户记录,然后在一秒钟内查询用户是管理员的公司的记录。
  3. 这些选项听起来很糟糕,但不管你信不信,Firebase的设计特别适用于"快速"在处理。它通过大规模弥补了代码/查询的低效率,因此在使用它时需要忘记许多特定于SQL的最佳实践,例如规范化数据,高效的查询/连接操作等。尽管看似额外的工作,如果您实际上对操作进行了基准测试(特别是如果启用了持久性/缓存等选项),即使使用这些额外的步骤,您也可以等于或超过SQL环境性能。可以把它想象为RISC与CISC,其中RISC是Firebase而CISC是SQL。