我知道这是一个讨论很多的主题,但对我来说,仍然不清楚在Firebase中创建高级查询的最佳方法是哪种。
目前我在前端使用Angular 2,在App引擎的后端使用Firebase + NodeJS(Admin SDK)。
前端:验证/简单查询/编写非敏感数据
NodeJS:编写高敏感数据/验证
完美无缺!
但现在我想创建高级查询,而这就是我挣扎的地方:
那么有什么好方法可以避免转移未经检索的数据吗?也许是因为我正在使用gcloud来管理sdk?
我真的很想念自定义端点。
提前THX!答案 0 :(得分:3)
谷歌回答“为什么不能进行高级查询?'只是"重组您的数据,因此您不需要进行高级查询"
这可能看起来像是一个廉价的裁剪,但这个想法是因为firebase应该是实时的,它需要尽快查询数据,并且可能没有足够的时间' / '资源'做高级查询。从谷歌的角度来看,这是有道理的,因为他们不能仅仅为您提供更多的服务器资源。谷歌的想法很简单,"我们会在您需要时为您提供所有数据,您的工作就是保持一致,并随心所欲地做任何事情"
因此,您的Node后端必须像服务器代理一样,从firebase获取实际数据,并对该数据执行高级查询,并将查询的数据返回给客户端。或者,您可以无需服务器并直接在客户端上执行此操作,但正如您所提到的那样,对于高敏感数据而言,这可能并不总是安全的。
基本上,您无法避免未经检索的数据,但可以将未经检查的数据保持在最低限度。这可以通过重组数据来实现。
谷歌给你的建议是,
根据您的观点构建数据 - Firebase,Google
这意味着,比如说有一个显示发票信息的视图。传统上,如果您来自SQL,那么您可以设计类似这样的内容
+ invoice
+ i01
+ date: xxx
+ customer: xxx
+ invoice_items
+ ii01
+ invoice: i01
+ product: p
+ qty: 1
...
谷歌希望你做的是
+ invoice
+ i01
+ date: xxx
+ customer: xxx
+ items: [
{
+ product: p
+ qty: 1
}]
...
这样,你就不需要'进行高级查询,因为您的视图所需的所有数据都已存在。
这可能看起来像退后一步,因为如果你想一想,这只会导致数据库状态迟早进入一个不一致的状态,并且你会纠正,它确实会这样做。但Firebase确实提供了相应的措施,例如multipath updates。
希望这会有所帮助:)