使用Firebase的数据库样式查询

时间:2012-07-20 22:32:44

标签: javascript firebase

使用Firebase执行数据库样式查询是否有快速方法?

例如:

如果firebase参考users包含字段user_idnameage,那么执行与此类似的查询的最佳方式是:

SELECT name FROM users WHERE `user_id`=147;

SELECT COUNT(*) FROM users WHERE age=21;

3 个答案:

答案 0 :(得分:70)

一般来说,没有。 Firebase本质上是一个“实时数据库”,随着数据的变化不断向您传输更新,因此进行通用查询更加困难。目前,提供了一些(公认有限的)查询原语。请参阅文档中的Queries/Limits页面。

您可以通过各种方法解决这些限制:

  • 智能地使用位置名称和优先级。如果您将数据结构化为/ users / [userid] / name,则只需检索/ users / 147 / name即可完成第一个“查询”。如果您知道要按年龄查询,可以使用age作为用户节点的优先级,然后执行“usersRef.startAt(21).endAt(21).on('child_added',...)”到让所有用户年龄为21岁。您仍然需要手动计算。
  • 进行客户端查询。如果整个数据集很小,您可以检索整个数据集,然后在客户端上手动过滤/处理它。
  • 运行单独的服务器。它可以连接到Firebase,同步数据,然后回答客户的“查询”。它仍然可以通过Firebase与客户进行通信,Firebase仍然可以作为主数据存储,但您的单独服务器可以快速执行查询。

我们打算随着时间的推移对此进行改进,因为我们发现与传统关系数据库系统提供的灵活查询相比,这是一个弱点。

答案 1 :(得分:24)

先生。 Lehenbauer当然是Firebase所有东西的主人,所以听他说。 ;)然而,这个特别的主题是我已经劳作了几个星期了。

以下是我的一些想法,以增强“运行单独的服务器”和“客户端查询”响应:

ElasticSearch(node.js脚本)

使用服务器上的node.js脚本,您可以集成ElasticSearch,并在一小时内提供一些可靠的内容搜索。这是一篇博文和一篇文章,让它更容易:https://www.firebase.com/blog/2014-01-02-queries-part-two.html

可缓存/常见查询

这些可以由服务器/ cron进程处理,该进程读取表并复制数据。例如,假设我想在注册期间为用户的登录名显示“不可用/可用”,但出于某些复杂的原因,用不同的唯一ID存储用户记录。

我的cron / server可以读取users表中的所有记录,然后将它们插入另一个通过电子邮件地址存储的表中,其值为用户的记录ID(或者我可能想知道的任何其他数据)。

这种重复数据方法是一种手动缓存技术,是No-SQL环境中的常见做法。我们正在为快速和简化的流程交易存储空间(这被认为是便宜且可用的)。

自定义查询(使用队列)

自定义查询可以通过XHR(ajax)直接发送到服务器,这可以节省大量工作并返回更好的结果。或者,您可以利用Firebase通过利用队列来连接服务器后端。

客户端将查询请求作为JSON放入名为queue的特殊Firebase表中,并等待响应。

服务器侦听queue.on('child_added', ...)并使用`queue_record.child('response',... data here ...)提供数据。

这有一些很好的优点。例如,任何数量的服务器都可以监听并提供响应,使负载平衡变得轻而易举。设置的代码非常简单,而covered in another thread在这里设置。

希望这有用!

答案 2 :(得分:2)

我为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