Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift Firestore按时间排序,但按ID排序_Swift_Firebase_Google Cloud Firestore - Fatal编程技术网

Swift Firestore按时间排序,但按ID排序

Swift Firestore按时间排序,但按ID排序,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,我一直在试图找到一种查询文档列表的方法,其中一个字段上有一个范围过滤器,而另一个字段上有一个顺序,这当然是不可能的,请参见我的另一个问题: 但是否可以将时间戳作为id保存文档,然后在默认情况下进行排序?或者硬编码一个ID,然后检索最后创建的文档ID,并将ID增加一个,以便下一篇文章上传 这显示文档在集合中的排序方式 您知道如何存储文档,以便在集合中创建时对文档进行排序吗 Firebase控制台中显示的文档顺序与使用Firestore的代码的功能基本无关。控制台仅用于浏览数据,这种排序方案使查找

我一直在试图找到一种查询文档列表的方法,其中一个字段上有一个范围过滤器,而另一个字段上有一个顺序,这当然是不可能的,请参见我的另一个问题:

但是否可以将时间戳作为id保存文档,然后在默认情况下进行排序?或者硬编码一个ID,然后检索最后创建的文档ID,并将ID增加一个,以便下一篇文章上传

这显示文档在集合中的排序方式


您知道如何存储文档,以便在集合中创建时对文档进行排序吗

Firebase控制台中显示的文档顺序与使用Firestore的代码的功能基本无关。控制台仅用于浏览数据,这种排序方案使查找可能要查找的文档(如果您知道其ID)变得相对直观。您无法在控制台中更改此排序顺序


您的代码显然会有其他需求,这些需求应该编码到您的查询中,而不考虑您在仪表板中看到的任何排序顺序。如果要对文档进行基于时间的排序,则必须在文档中存储某种时间戳字段,并使用该字段进行排序。我不建议使用时间戳作为文档的ID,因为这可能会在将来给您带来问题。

如果我正确理解您的需要,通过执行以下操作,您应该获得正确的顺序:

对于每个文档,添加一个类型为number的特定字段,例如称为
sortNbr
,并将您计算的时间戳指定为值(例如,历元时间,请参阅)

然后构建一个按此字段值排序的查询,如:

let docRef = db.collection("xxxx")
docRef.order(by: "sortNbr")
请参见此处的文档:

是的,您可以这样做

默认情况下,查询检索满足中查询的所有文档 按文档ID升序

请参见此处的文档:

因此,如果您找到了一种使用时间戳或其他主键值的方法,其中升序字典顺序是您想要的,那么您可以按任何字段进行筛选,并且仍然可以按主键升序对结果进行排序

如果使用数字键(如从历元开始的秒数或整数序列),请小心将数字归零至最大精度。10在词典编纂上小于2,但10大于02

使用ISO格式的
YYYY-mm-ddTHH:mm:SS
date-time字符串会起作用,因为它们会按升序自然排序。

它会起作用

您可以使用
.order(by:'.\u id.''.')
,但我不太了解Swift,但我假设它类似于

.order(作者:FirebaseFirestore.FieldPath.documentID())
JavaScript也有一个内部变量,它只返回
\uuid\uuid

.orderBy(firebase.firestore.FieldPath.documentId())

有趣的是,
\uuuuuuu name\uuuuuuuu
也可以,但这会对整个路径进行排序,包括集合名称(当然还有id)。

您是否遵循了上面的链接?它解释说,如果我在一个字段上创建一个范围过滤器并按另一个字段排序,则不可能创建查询。当我使用getDocuments将数据提取到应用程序中时,它们的排序方式与firestore控制台中的排序方式相同。这只是巧合吗?如果您需要文档的排序顺序,您应该在查询中指定一个排序顺序。如果您没有定义排序顺序,文档不会定义排序顺序,因此您不应该依赖偶然行为。您刚刚粉碎了一个简单解决方案的梦想哈哈,但这确实回答了我的问题,谢谢。@DougStevenson这不是偶然行为:“默认情况下,查询按文档ID升序检索满足查询的所有文档。”这里有两个问题。我回答了第二个问题。你看,你可以按“名称”排序,这不需要复合索引。当你可以简单地将一个适当的时间戳值存储为一个字段,并在该字段上排序时,你为什么要这样做?在这种情况下,依赖于这种默认行为似乎没有意义。OP发布了一个问题,其中无法对一个字段进行筛选并对另一个字段进行排序。但我想知道这是否已经过时了?IIRC我已经使用复合索引完成了这项工作,至少是通过web API完成的。.order(by:'name')这有语法错误,请在发布前检查您的答案,因为这会浪费我们的时间;)更新以使其符合
顺序(by:“\uuuu id\uuuuu”)
,但下划线不是故意的,否则它将引用名为“id”或“name”的字段,而不是文档id(或完整路径,在
\uu name\uuuuuuu
的情况下),我认为也是这样做的:.orderBy(firebase.firestore.FieldPath.documentId())@bmm nice find!!这是一个更好、更惯用的解决方案,而且它甚至有文档记录