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