firebase:在firebase中实现模式搜索

Sha*_*ico 5 sql angularjs firebase

我知道WHEREfirebase中没有任何条款.但是我们如何在firebase中实现模式搜索,就像我们在SQL中使用LIKEoperator一样.

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

SELECT * FROM Customers WHERE City LIKE 's%';
Run Code Online (Sandbox Code Playgroud)

Abe*_*ins 14

想法

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

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

节点脚本

这通常通过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);

});
Run Code Online (Sandbox Code Playgroud)

这个脚本将创建一个这样的结构:

{
  "users": {
    "data": {
      "Tim": {"hair": "red", "eyes": "green", "city": "Chicago"} 
    },
    "byCity": {
      "Chicago": {
        "-asd09u12": "Tim"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

客户端脚本

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

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();

  });
});
Run Code Online (Sandbox Code Playgroud)

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