firebase:在firebase中实现模式搜索

时间:2013-12-23 10:19:54

标签: sql angularjs firebase

我知道firebase中没有WHERE子句。但是我们如何在firebase中使用LIKE运算符在SQL中实现模式搜索。

我们如何在firebase中实现以下sql查询?

SELECT * FROM Customers WHERE City LIKE 's%';

3 个答案:

答案 0 :(得分:14)

想法

近乎解决方案是在服务器端NodeJS脚本中创建由City(或您要搜索的其他任何字段)索引的数据索引。

这将不完全复制LIKE的行为,但是它允许通过城市名称轻松查询,这可以消除对该行为的需要。

节点脚本

这通常是通过NodeJS编写的简单服务器端脚本完成的。想象一下您的用户数据存储在/users/data中的情况。你的脚本看起来像这样。

var ref = new Firebase("<Your Firebase>.firebaseio.com");

// A Firebase ref where all our users are stored
var userDataRef = ref.child('users/data');

// A Firebase ref which is where we store our index
var byCityRef = ref.child("users/byCity");

// Then bind to users/data so we can index each user as they're added
userDataRef.on("child_added", function (snapshot) {

  // Load the user details
  var user = snapshot.val();

  // Use the snapshot name as an ID (i.e. /users/data/Tim has an ID of "Tim")
  var userID = snapshot.name();

  // Push the userID into users/byCity/{city}
  byCityRef.child(user.city).push(userID);

});

此脚本将创建如下结构:

{
  "users": {
    "data": {
      "Tim": {"hair": "red", "eyes": "green", "city": "Chicago"} 
    },
    "byCity": {
      "Chicago": {
        "-asd09u12": "Tim"
      }
    }
  }
}

客户端脚本

一旦我们将数据编入索引,查询数据很简单,只需两个简单的步骤即可完成。

var ref = new Firebase("<Your Firebase>.firebaseio.com");
var userDataRef = ref.child('users/data');
var byCityRef = ref.child('users/byCity')

// Load children of /users/byCity/Chicago
byCityRef.child('Chicago').on("child_added", function (snapshot) {

  // Find each user's unique ID
  var userID = snapshot.val();

  // Then load the User's data from /users/data/{ID}
  userDataRef.child(userID).once(function (snapshot) {

    // userID = "Tim"
    // user = {"hair": "red", "eyes": "green", "city": "Chicago"}
    var user = snapshot.val();

  });
});

现在,您具有Firebase的近实时加载速度和强大的查询功能!

答案 1 :(得分:4)

你做不到。您需要手动枚举对象并自行搜索。对于可能没问题的小数据集。但是你要用更大的数据集来燃烧带宽。

Firebase使用优先级支持一些有限的查询功能,但仍然不是您要求的。

他们不支持此类广泛查询的原因是因为它们针对速度进行了优化。您应该考虑更适合搜索的其他服务,例如弹性搜索或传统的RDBMS。

您仍然可以将firebase与其他系统一起使用,以充分利用其优势 - 近乎实时的对象提取和同步。

答案 2 :(得分:1)

我在同一时间,实施“搜索火力基地的可能性” 在他们的网站上,你有两个有趣的帖子:

对于基本查询(如果不是enouth,请参阅第2部分):

第1部分:https://www.firebase.com/blog/2013-10-01-queries-part-one.html

第2部分:https://www.firebase.com/blog/2014-01-02-queries-part-two.html

在第2部分中,讨论如何实现类似sql'如%any%' 在简历中,Firebase本身并不适合复杂的查询,然后建议使用与elasticsearch:elasticsearch.org的补充。 对我来说是困惑的事情,需要很多服务来做一些简单的事情,比如找东西。

Elasticsearch有很多非常有趣的工具 你有需要吗

1:在同一服务器上运行的nodejs脚本

2:运行弹性搜索服务

3:您的应用与客户端进行搜索。