我有以下结构:
{
"users" : {
"123" : {
"activities" : {
"horse" : "horse",
"bike" : "bike"
},
"age" : 21
},
"124" : {
"activities" : {
"bike" : "bike"
},
"age" : 30
}
}
我正在尝试做类似的事情:
SELECT * FROM users WHERE (activities = 'horse' OR activities = 'bike') AND age >= 21
我可以请一点指点吗?如果我没有正确构建数据,我是否也可以获得一些提示?
编辑:jsfiddle
答案 0 :(得分:2)
我会将此问题标记为重复,但此代码可能对您开始构建自己的搜索索引有所帮助:
var ref = new Firebase('https://yours.firebaseio.com/users');
var index = new Firebase('https://yours.firebaseio.com/index');
function createIndex() {
ref.once('value', function(snapshot) {
snapshot.forEach(function(userSnapshot) {
var user = userSnapshot.val();
index.child(user.age).child(userSnapshot.key()).set(true);
Object.keys(user.activities).forEach(function(activity) {
index.child(activity).child(userSnapshot.key()).set(true);
});
});
});
}
由于您要搜索所有用户,代码会循环遍历所有用户(通常应在添加或修改用户时执行此操作,因此通过侦听child_
事件)。然后将相关节点添加到索引中:一个用于年龄,一个用于每个类别。
在您的数据上运行此操作后,index
节点如下所示:
{
"21": {"123":true},
"30":{"124":true},
"bike":{"124":true},
"horse":{"123":true}
}
因此,您可以通过以下方式获得20到30之间的所有用户:
ref.startAt("20").endAt("30").on('child_added'
或所有具有“马”活动的用户:
ref.equalTo("horse").on('child_added'