Javascript 如何在Firebase中基于多个条件进行查询?
我的结构如下:Javascript 如何在Firebase中基于多个条件进行查询?,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我的结构如下: { "users" : { "123" : { "activities" : { "horse" : "horse", "bike" : "bike" }, "age" : 21 }, "124" : { "activities" : { "bike" : "bike" }, "age" : 30 } } 我正在尝试做类似的事情
{
"users" : {
"123" : {
"activities" : {
"horse" : "horse",
"bike" : "bike"
},
"age" : 21
},
"124" : {
"activities" : {
"bike" : "bike"
},
"age" : 30
}
}
我正在尝试做类似的事情:
从(活动='horse'或活动='bike')、年龄>=21的用户中选择*
我能得到一些关于这个的建议吗?如果我没有正确地组织数据,我还能从那里得到一些提示吗
编辑:我将此问题标记为重复问题,但此代码可能有助于您开始构建自己的搜索索引:
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);
});
});
});
}
由于您希望在所有用户之间进行搜索,因此代码会在所有用户之间循环(您通常应该在添加或修改用户时执行此操作,因此可以通过侦听子事件来执行此操作)。然后将相关节点添加到索引中:一个用于年龄,一个用于每个类别
对数据运行此操作后,索引
节点如下所示:
{
"21": {"123":true},
"30":{"124":true},
"bike":{"124":true},
"horse":{"123":true}
}
因此,您可以通过以下方式获得20到30岁之间的所有用户:
ref.orderByKey().startAt("20").endAt("30").on('child_added'
或通过以下方式使用“horse”活动的所有用户:
ref.orderByKey().equalTo("horse").on('child_added'
Firebase查询只能按单个属性排序/筛选。在某些情况下,您可能可以将条件合并到单个属性中,但在这里似乎不可能。我已经查看了你发送的链接,但由于某些原因,我无法使用该代码逻辑。虽然我理解这个想法。要么api同时改变了,要么什么的,但我不能得到我的结果去过滤。我觉得可以自由分享你的代码,最好是把它编辑成你的问题。一个JSFIDLE会更好。@FrankvanPuffelen看我的例子。现在它返回所有。我尝试了.startAt('letsGame').endAt('letsGame')
和equalTo('letsGame')
,但没有结果您只能查询一级深度的属性。谢谢你,弗兰克,我会试试的