使用Firebase的数据库样式查询



有没有一种快速的方法可以用Firebase执行数据库风格的查询?

例如:

给定一个具有字段user_idnameage的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 

最新更新