我知道Firebase中没有WHERE
子句。但是我们如何在Firebase中实现模式搜索,就像我们可以使用LIKE
运算符在SQL中进行一样。
我们如何在Firebase中实现以下SQL查询?
SELECT * FROM table_name WHERE column_name LIKE 'pattern';
SELECT * FROM Customers WHERE City LIKE 's%';
一个近似的解决方案是在服务器端使用 NodeJS 脚本创建一个以城市(或其他您想要搜索的字段)为索引的数据索引。
虽然这并不完全复制 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 近乎实时的加载速度,并具有强大的查询功能!