带有Firebase的数据库式查询
使用Firebase执行数据库式查询有没有一种快速的方法?
例如:
给定具有user_id
, name
和age
字段的firebase引用users
,执行与此类似的查询的最佳方式是:
SELECT name FROM users WHERE `user_id`=147;
和
SELECT COUNT(*) FROM users WHERE age=21;
一般来说,没有。 Firebase本质上是一个“实时数据库”,随着数据的变化不断向您发送更新,因此进行通用查询更为困难。 现在,有一些(被公认是有限的)查询提供的原语。 请参阅文档中的查询/限制页面。
您通常可以通过各种方法解决这些限制:
- 智能地使用位置名称和优先级。 如果将数据构build为/ users / [userid] / name,则只需检索/ users / 147 / name即可完成第一个“查询”。 如果你知道你想按年龄查询,你可以使用年龄作为用户节点的优先级,然后执行“usersRef.startAt(21).endAt(21).on('child_added',…)”获得所有用户的年龄21.您仍然需要手动计数。
- 做客户端查询。 如果整个数据集较小,则可以检索整个数据集,然后在客户端上手动过滤/处理。
- 运行单独的服务器 。 它可以连接到Firebase,同步数据,然后回答客户的“查询”。 它仍然可以通过Firebase与客户进行沟通,Firebase仍然可以作为主要的数据存储,但您的独立服务器可以快速执行查询。
我们打算随着时间的推移对此进行改进,因为我们意识到与传统关系数据库系统提供的灵活查询相比,这是一个薄弱环节。
Lehenbauer先生当然是Firebase的所有东西的主人,所以听他说。 ;)但是,这个特定的话题是我现在已经工作了几个星期了。
以下是我的一些想法,以增强“运行单独的服务器”和“客户端查询”响应:
ElasticSearch(一个node.js脚本)
通过在服务器上使用node.js脚本,您可以集成ElasticSearch并在一小时内提供一些稳定的内容search。 这里有一个博客文章和一个使它更容易的库: https : //www.firebase.com/blog/2014-01-02-queries-part-two.html
caching/通用查询
这些可以通过读取表格并复制数据的服务器/ cron进程来处理。 例如,假设我想在注册期间为用户的login名显示“不可用/可用”,但由于某种复杂的原因,将用户logging存储为不同的唯一ID。
我的cron /服务器可以读取用户表中的所有logging,然后将它们插入到另一个用电子邮件地址存储的表中,用户的loggingID(或者我想知道的任何其他数据)的值。
这种重复的数据方法是一种手动caching技术,在无SQL环境中是常见的做法; 我们正在交易存储空间(这被认为是便宜和可用)的速度和简化的过程。
自定义查询(使用队列)
自定义查询可以通过XHR(ajax)直接发送到服务器,这可以做艰苦的劳动,并返回更好的结果。 或者,您可以利用Firebase利用队列连接服务器后端。
客户端将查询请求作为JSON放入一个名为queue
的特殊Firebase表中,并等待响应。
服务器侦听queue.on('child_added', ...)
并使用`queue_record.child('response',… data here …)返回数据。
这有一些很好的优点。 首先,任何数量的服务器都可以监听并提供响应,使负载平衡变得轻而易举。 这个代码非常简单,可以在SO 中的另一个线程中进行设置和覆盖 。
希望这是有帮助的!
我为firebase创build了自己的CMS,所以当创build一个firebase数据表时,我用这个过滤了它
var child = ref.child(); var compare; switch(filter){ case "First_Name": compare = child.First_Name; break; case "Last_Name": compare = child.Last_Name; break; case "Phone_Number": compare = child.Phone_Number; break; case "Department_Number": compare = child.Department_Number; break; case "Position": compare = child.Position; break; case "Status": compare = child.Status; break; case "Tier": compare = child.Tier; break; } if(compare.match("^" + string)){ //display items