【问题标题】:Multiple orderBy in firestoreFirestore 中的多个 orderBy
【发布时间】:2021-02-05 22:01:26
【问题描述】:

我有一个关于多个 orderBy 如何工作的问题。

假设这些文件:

collection/   
    doc1/
       date: yesterday at 11:00pm
       number: 1
    doc2/
       date: today at 01:00am
       number: 6
    doc3/
       date: today at 13:00pm
       number: 0

如果我按这样的两个字段排序:

  .orderBy("date", "desc")
  .orderBy("number", "desc")
  .get()

这些文档是如何排序的?

反之呢

  .orderBy("number", "desc")
  .orderBy("date", "desc")
  .get()

这会导致相同的顺序吗?

我有点困惑,因为我不知道它是否总是会以最后一个 orderBy 结束。

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    在 Firebase 中orderBy() 的文档中是这样说的:

    您还可以按多个字段排序。例如,如果您想按州排序,并且在每个州内按人口降序排列:

    Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
    

    所以,基本上就是这样。使用来自 SQL 的逻辑,您可以通过 ORDER BY 对表进行排序。假设您有一个来自世界各地的客户数据库。然后您可以使用ORDER BY Country,您将按您想要的任何顺序按他们的国家/地区订购它们。但是,如果您添加第二个参数,比如说Customer Name,那么它将首先按Country 排序,然后在该排序列表中按Customer Name 排序。示例:

     1. Adam | USA |
     2. Jake | Germany |
     3. Anna | USA |
     4. Semir | Croatia |
     5. Hans | Germany |
    

    当您致电orderBy("country") 时,您会得到:

    1. Semir | Croatia |
    2. Jake | Germany |
    3. Hans | Germany |
    4. Adam | USA |
    5. Anna | USA |
    

    然后当你打电话给orderBy("customer name") 你会得到这个:

    1. Semir | Croatia |
    2. Hans | Germany |
    3. Jake | Germany |
    4. Adam | USA |
    5. Anna | USA |
    

    您可以看到 Hans 和 Jake 交换了位置,因为 H 在 J 之前,但它们仍然按国家/地区名称排序。在你使用这个的情况下:

    .orderBy("date", "desc")
    .orderBy("number", "desc")
    .get()
    

    它将首先按日期排序,然后按数字排序。但是由于您没有相同的日期值,因此您不会注意到任何差异。这也适用于第二个。但是假设您的某个字段具有相同的日期,因此您的数据如下所示:

    collection/   
        doc1/
           date: yesterday at 11:00pm
           number: 1
        doc2/
           date: today at 01:00am
           number: 6
        doc3/
           date: today at 01:00am
           number: 0
    

    现在,doc2 和 doc3 的日期均为 today at 01:00am。现在,当您按日期订购时,它们将在另一个之下,可能 doc2 将首先显示。但是当您使用orderBy("number") 时,它会检查同一日期内的数字。所以,如果它只是 orderBy("number") 没有“desc”,你会得到这个:

    orderBy("date");
    output: 1. doc1, 2. doc2, 3. doc3
    
    orderBy("number");
    output: 1. doc1, 2. doc3, 3. doc2
    

    因为数字 0 在 6 之前。只需将其反转为 desc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2021-12-24
      • 2022-08-17
      • 2020-11-06
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多