46

有没有一种使用 Firebase 执行数据库样式查询的快速方法?

例如:

users给定带有字段user_idname和的 firebase 引用age,执行类似于此的查询的最佳方法是什么:

SELECT name FROM users WHERE `user_id`=147;

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

3 回答 3

70

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

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

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

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

于 2012-07-20T23:21:14.407 回答
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 放入一个名为的特殊 Firebase 表中queue并等待响应。

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

这有一些不错的优点。一方面,任何数量的服务器都可以监听并提供响应,使负载平衡变得轻而易举。在 SO中的另一个线程中设置和覆盖此代码非常简单。

希望这有帮助!

于 2012-07-23T14:19:17.253 回答
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 
于 2014-07-12T19:35:25.000 回答