有没有一种快速的方法可以用Firebase执行数据库风格的查询?
例如:
给定一个具有字段user_id
、name
和age
的firebase引用users
,执行类似查询的最佳方法是什么:
SELECT name FROM users WHERE `user_id`=147;
和
SELECT COUNT(*) FROM users WHERE age=21;
一般来说,没有。Firebase本质上是一个"实时数据库",随着数据的变化,它会不断向您流式更新,因此更难进行通用查询。目前,提供了几个(诚然是有限的)查询原语。请参阅文档中的查询/限制页面。
您通常可以通过多种方法绕过这些限制:
- 智能地使用位置名称和优先级如果您将数据结构为/users/[userid]/name,则只需检索/users/147/name即可完成第一次"查询"。如果您知道要按年龄查询,可以使用年龄作为用户节点的优先级,然后执行"usersRef.startAt(21).endAt(21.on('child_addd',…)"以获取所有年龄为21岁的用户。你仍然需要手动计数
- 执行客户端查询如果整个数据集很小,则可以检索整个数据集,然后在客户端上手动进行筛选/处理
- 运行单独的服务器。它可以连接到Firebase,同步数据,然后为客户端回答"查询"。它仍然可以通过Firebase与客户端通信,Firebase仍然可以是主要的数据存储,但您的独立服务器可以快速执行查询
我们打算随着时间的推移对此进行改进,因为我们意识到与传统关系数据库系统提供的灵活查询相比,这是一个弱点。
Mr。Lehenbauer当然是Firebase的大师,所以听他的。)然而,这个特殊的话题是我已经研究了几个星期的。
以下是我的一些想法,以增强"运行单独的服务器"one_answers"客户端查询"的响应:
ElasticSearch(node.js脚本)
通过服务器上的node.js脚本,您可以集成ElasticSearch,并在不到一个小时的时间内提供一些可靠的内容搜索。下面是一篇博客文章和一个库,让它变得更容易:https://www.firebase.com/blog/2014-01-02-queries-part-two.html
可缓存/常见查询
这些可以由server/cron进程处理,该进程读取表并复制数据。例如,假设我想在注册过程中为用户的登录名显示"不可用/可用",但由于一些复杂的原因,使用不同的唯一ID存储用户记录。
我的cron/server可以从users表中读取所有记录,然后将它们插入到另一个通过电子邮件地址存储的表中,其中包含用户的记录ID值(或我可能想知道的任何其他数据)。
这种重复数据方法是一种手动缓存技术,在无SQL环境中是一种常见的做法;我们正在用存储空间(被认为是廉价和可用的)换取速度和简化的流程。
自定义查询(使用队列)
自定义查询可以通过XHR(ajax)直接发送到服务器,这样可以完成繁重的工作并返回更好的结果。或者,您可以利用Firebase通过队列与服务器后端连接。
客户端将查询请求作为JSON放入一个名为queue
的特殊Firebase表中,并等待响应。
服务器侦听queue.on('child_added', ...)
,并使用`queue_record.child('response',…data here…)将数据发回
这有一些不错的优点。首先,任何数量的服务器都可以监听并提供响应,使负载平衡变得轻而易举。这方面的代码设置起来非常简单,并包含在SO.中的另一个线程中
希望这有帮助!
我为firebase创建了自己的CMS,所以在创建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