如何使用 firebase 按查询进行排序
How to do order by query using firebase
我在我的 android 应用程序上使用 firebase。我需要帮助来解决我的麻烦。我想做这样的请求:我正在使用 oderbyChild("date") 通过这样做从最近的日期到最远的日期对我的数据进行排序。
MyApplication.backend.child(urls).orderByChild("value").addValueEventListener(new ValueEventListener() {
}
现在我想要 select 所有 activity 值完成的地方,并按我的日期值排序主题。我写了这个:
MyApplication.backend.child(urls).orderByChild("task").equalTo("done").addValueEventListener(new ValueEventListener(){
}
我的问题是无法对同一个 fireBase 查询执行 2 个两个 orderByChild。我怎样才能解决这个问题 ?请需要帮助。
假设您的数据如下所示
activities
-JKjasjiji
date: 20151129
is_done: false
-Ykkjaso23
date: 20151128
is_done: true
-Jkaisjiij
date: 20151127
is_done: false
有几种方法可以解决这个问题。
1) 查询 is_done: true 的所有活动,然后在代码中对结果进行排序。根据数据集大小,这可能非常低效。对 100 万个代码进行排序会很糟糕。
2) 将完成的活动存储在另一个节点中
activities
-JKjasjiji
date: 20151129
-Jkaisjiij
date: 20151127
done_activities
-Ykkjaso23
date: 20151128
3) 以启用 'and' 类型查询的格式存储数据
activities
-JKjasjiji
done_and_date: false_20151129
-Ykkjaso23
done_and_date: true_20151128
-Jkaisjiij
done_and_date: false_20151127
然后用户 .startAt 和 .endAt...
ref.orderByKey().startAt("true_20151128").endAt("true_20151129")
将给出 return 在两个指定日期之间完成的所有活动。
构建数据可以简化查询。
@Jay 的回答很好。这是解决这个问题的另一种方法,with the Bolt compiler.
假设您正在构建一个费用报告应用,您的数据结构如下:
type User {
name: String;
uid: String;
}
type Expense {
id: String;
amount: Number;
uid: uid;
year: Number;
}
path /users/$uid is User;
path /expenses/$expense_id is Expense;
现在假设您想要获得用户 1 在 2014 年发生的所有费用。如果这是 SQL 您可以说:
SELECT *
FROM Expenses
WHERE uid == "1" AND year == 2014
使用 Firebase SDK,您想做这样的事情:
ref.child('expenses')
.orderByChild('uid')
.equalTo('1')
.orderByChild('year')
.equalTo('2014');
但是,那是不可能的。那么我们该怎么办呢? 重组我们的数据以适应这种查询。
与其将所有费用存储在 /expenses
位置下,我们可以使用 /expenses/year
创建年份索引。这看起来像:
path /expenses/$year/$expense_id 是 Expense
现在我们上面想做的查询可以通过以下方式实现:
ref.child('2014')
.orderByChild('uid')
.equalTo('1');
您为数据选择的结构将允许您根据需要获取数据。您可能会发现需要复制数据才能执行此操作。这没关系。如果您需要保留 data consistent across multiple locations, you can use client-side fanout.