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

Posted

技术标签:

【中文标题】如何按两个字段对 Firebase 记录进行排序(Android)[重复]【英文标题】:How to sort Firebase records by two fields (Android) [duplicate] 【发布时间】:2021-01-04 03:05:01 【问题描述】:

我正在使用FirebaseRecyclerAdapter 并将FirebaseRecyclerOptions 与一些查询一起传递给构造函数。每个项目都有多个字段,包括时间戳a 和另一个整数字段b。因此,我希望具有较旧 a 但较少 b 的项目位于列表顶部。用 sqlite 很容易实现,但用 nosql 就不是那么容易了。看来我需要添加一些额外的字段来保留这两个字段: String.valueOf(a) + String.valueOf(b) 但是如何实现 asc / desc 属性?

加载整个列表并在 Java 中排序不是一种选择。

【问题讨论】:

您似乎已经在实时数据库中找到了filter on multiple properties 的方法。没有让数据库反转结果的选项,但您可以:1) 在客户端反转它们,考虑到您已经通过网络连接加载所有数据,这是一个总是的选项, 2) 将反转值存储在数据库的属性中并对其进行排序。请参阅 this answer 以及来自 this list 的更多信息。 【参考方案1】:

很遗憾,Firebase 实时数据库不支持对多个属性的查询,仅支持对单个子属性的查询。因此,您猜对了,您需要创建一个额外的字段来保留这两个字段。因此,要实现这一点,您需要创建一个新字段,该字段在您的数据库中应如下所示:

Firebase-root
   |
   --- itemId
          |
          --- a: valueOfA
          |
          --- b: valueOfB
          |
          --- a_b: valueOfA_valueOfB

如您所见,a_b 属性结合了您要过滤的值。

与 Firebase 实时数据库不同,Cloud Firestore 允许 compound queries。你应该看看这个。因此,Cloud Firestore 允许在不创建组合属性的情况下进行如下查询。

itemIdRef.whereEqualTo("a", "valueOfA").whereEqualTo("b", "valueOfB");

当您订购字符串时,这是正常的订购方法。一个快速的解决方法是在每个第二个元素之前添加两个零,如下所示:"1516428687_001""1516428687_002""1516428687_012"。现在你的订单会很好。更多解释请看我在post的回答。

【讨论】:

问题是我实际上要求所有没有equalsTo但有订单的项目。在这种情况下,如果我只是连接两个字段,那么我将无法使用我在问题中提到的 ASC/DESC 谈到 Firebase 实时数据库,是的,您可以,将新的 a_b 属性传递给 order 方法,如下所示:.orderBy("a_b") 我想过 - 但实际上它不会起作用,因为我猜 Firebase 在内部使用标准字符串比较器,因此三个键的顺序将遵循 "1516428687_1", "1516428687_12", "1516428687_2"。但我需要"1516428687_1", "1516428687_2", "1516428687_12"。你有更多的想法@alex-mamo? 当您的订单字符串时,这是正常的订购方法。一个快速的解决方法是在每个第二个元素之前添加两个零,如下所示:"1516428687_001", `"1516428687_002", "1516428687_012"`。现在你的订单会很好。更多解释请看我here的回答。现在可以了吗? 是的,这行得通,我实现了这种方法,但这种解决方法远非简单的解决方案。目前看来,firebase 严重缺乏 API。你可以编辑你的答案,或者只是添加对另一个答案的引用,我接受吗?

以上是关于如何按两个字段对 Firebase 记录进行排序(Android)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

如何按字段值(即“原因”字段名称及其值可能是“垃圾邮件”、“裸露”等)对 Firebase Firestore 数据进行排序

如何在 Firebase 云 Firestore 中查询一个字段然后按另一个字段排序?

我们如何使用 Angular 按 TimeStamp 数据类型对 Firebase Firestore 数据进行排序?

Flutter 按时间戳对 Firebase 快照进行排序

Firebase 如何通过 createdAt 字段对集合进行排序? [复制]