firestore 中的多个 orderBy

Rau*_*aul 3 firebase google-cloud-firestore

我有一个关于多重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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

这些文档是如何排序的?而且,反其道而行之又如何?

.orderBy("date", "desc")
.orderBy("number", "desc")
.get()
Run Code Online (Sandbox Code Playgroud)

这会产生相同的顺序吗?

我有点困惑,因为我不知道它是否总是会在最后订购orderBy

Slo*_*ing 16

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

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

Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
Run Code Online (Sandbox Code Playgroud)

所以,基本上就是这样。使用来自 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 |
Run Code Online (Sandbox Code Playgroud)

当你打电话时orderBy("country")你会得到这个:

1. Semir | Croatia |
2. Jake | Germany |
3. Hans | Germany |
4. Adam | USA |
5. Anna | USA |
Run Code Online (Sandbox Code Playgroud)

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

1. Semir | Croatia |
2. Hans | Germany |
3. Jake | Germany |
4. Adam | USA |
5. Anna | USA |
Run Code Online (Sandbox Code Playgroud)

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

 1. Adam | USA |
 2. Jake | Germany |
 3. Anna | USA |
 4. Semir | Croatia |
 5. Hans | Germany |
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

1. Semir | Croatia |
2. Jake | Germany |
3. Hans | Germany |
4. Adam | USA |
5. Anna | USA |
Run Code Online (Sandbox Code Playgroud)
1. Semir | Croatia |
2. Hans | Germany |
3. Jake | Germany |
4. Adam | USA |
5. Anna | USA |
Run Code Online (Sandbox Code Playgroud)

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