如何使用firebase通过查询进行订购[重复]

Posted

技术标签:

【中文标题】如何使用firebase通过查询进行订购[重复]【英文标题】:How to do order by query using firebase [duplicate] 【发布时间】:2016-03-02 18:39:06 【问题描述】:

我在我的 android 应用上使用 firebase。我需要帮助来解决我的问题。我想做这样的请求:我正在使用 oderbyChild("date") 通过这样做来将我的数据从最近的日期排序到最远的日期。

MyApplication.backend.child(urls).orderByChild("value").addValueEventListener(new ValueEventListener() 

现在我想选择所有活动值完成的地方,并按我的日期值排序主题。我写了这个:

MyApplication.backend.child(urls).orderByChild("task").equalTo("done").addValueEventListener(new ValueEventListener()

我的问题是不可能在同一个 fireBase 查询上执行 2 个两个 orderByChild。我怎样才能解决这个问题 ?请需要帮助。

【问题讨论】:

见***.com/questions/26700924/…。 【参考方案1】:

结构化数据可以简化查询。

@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/year 为年份创建索引,而不是将所有费用存储在/expenses 位置下。这看起来像:

路径 /expenses/$year/$expense_id 是 Expense

现在可以通过以下方式实现我们想要执行的查询:

ref.child('2014')
   .orderByChild('uid')
   .equalTo('1');

您为数据选择的结构将允许您根据需要获取数据。您可能会发现需要复制数据才能执行此操作。这没关系。如果您需要保留您的data consistent across multiple locations, you can use client-side fanout。

【讨论】:

【参考方案2】:

假设您的数据如下所示

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) 以支持“和”类型查询的格式存储数据

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")

将返回在两个指定日期之间完成的所有活动。

【讨论】:

以上是关于如何使用firebase通过查询进行订购[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何订购firebase的文件?

使用 Firebase 订购 [关闭]

如何使用颤振在firebase中进行查询?

如何按两个字段对 Firebase 记录进行排序(Android)[重复]

如何按两个字段对 Firebase 记录进行排序(Android)[重复]

如何按两个字段对 Firebase 记录进行排序(Android)[重复]