2017-03-06 117 views
0

这里是我的火力地堡数据结构:火力地堡数据库访问多个记录

{ 
    "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" 
} 

这里是我的火力地堡安全规则

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

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

这是不可行的索引更新为每个用户的安全规则,所以我会怎么处理呢?

回答

1

Firebase不支持您习惯使用的类过滤器中的“过滤”。根据您当前的数据结构,你要么需要:

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

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

+2

“Firebase不支持任何类型的过滤/搜索。”这种说法在这方面似乎有误导性。不是本身搜索,而是'orderBy' +'equalTo'是一个简单的过滤器,适用于@ Cody的问题。我不熟悉REST API,但是对孩子的孩子进行排序,称为[deep querying](https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html ),在SDK中肯定是可行的。 –

+0

因为Firebase文档中有关于排序和过滤数据的整个部分,所以我确实会更改第一句话:https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data。 –

+0

@TravisChristian - 我读过那篇文章,以及Frank发布的一篇文章。但是,我无法查询上面提到的方式。 随着深入查询他们的参考,密钥总是相同的,即'高度','重量'等。 我正在查询将改变的键。键是用户uid。此外,将这些ID作为密钥存储在字典中是Firebase数据库中推荐的存储实践。 https://firebase.google.com/docs/database/web/structure-data#fanout –