【问题标题】:Get data ordered by document Id descending in Firestore获取按文档 ID 在 Firestore 中降序排列的数据
【发布时间】:2018-05-06 08:16:32
【问题描述】:

我想从我的 Firestore 数据库中获取按documentId 降序排列的数据。当我打电话时:

firestore.collection("users")
    .orderBy(FieldPath.documentId(), Query.Direction.DESCENDING)
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {...});

我收到错误:

FAILED_PRECONDITION:查询需要索引。

带有用于自动创建索引的 Firebase 控制台的链接。不幸的是,在这种情况下,自动创建似乎不起作用。当我点击创建索引时,我收到一条消息:

__name__ 不支持仅索引

对于手动索引创建,doc 仅表示按字段名称(而不是documentId)进行索引。有谁知道如何从 Firestore 中获取按documentId 降序排列的数据?

我知道我可以在客户端重新排序数据,但是按 id 排序是一项很自然的任务,我一定会遗漏一些东西。谢谢你。我用:

compile 'com.google.firebase:firebase-firestore:11.6.0'

【问题讨论】:

  • firestore 中的读取权限如何?
  • 你能分享你的“规则”json吗?也许你需要类似:'".indexOn": ["documentId"]'
  • 在测试时,我有默认的 Firestore 访问权限,即允许所有人读写。 @NicoT.:请您发送一个文档链接吗?
  • @NicoT。谢谢,但这是针对实时数据库的文档,而不是针对 Cloud Firestore 的文档。

标签: android firebase google-cloud-firestore


【解决方案1】:

如 Firestore 文档 here 中所述,Cloud Firestore 不提供对自动生成的 docID 的自动排序。

重要提示:与 Firebase 实时数据库中的“推送 ID”不同,Cloud Firestore 自动生成的 ID 不提供任何自动排序。如果您希望能够按创建日期对文档进行排序,则应将时间戳作为字段存储在文档中。

因此,您可以通过添加一个额外字段 createdDate 并使用 annotation @ServerTimestamp 设置它来实现排序,在您的用户 POJO 中的类字段之前声明它,例如这。

@ServerTimestamp
Date createdDate;

此外,当 POJO 写入 Firestore 时,您必须确保该字段为空,在将其保存到 Firestore 之前不要对其设置任何值。

【讨论】:

  • Firestore 不订购自动生成的 ID 的原因导致我手动调用 .orderBy(...)。问题是排序需要索引,我不知道如何在 ID 上创建。
  • 如果我正确理解了您的查询,那么您仍然希望将自动生成的 Firestore ID 添加为索引,以便根据它对结果进行排序。这里有 件事:1.) Firebase 团队建议不要使用自动生成的 ID 来对查询结果进行排序,因为它们不提供像 RTDB 推送 ID 这样的自动排序。 2.) 您只能将文档字段创建为查询索引,并且 ID 不是文档的一部分。此外,默认情况下,每个 doc 字段都被索引。因此,他们建议添加一个额外的字段 createDate 如上所述,以根据文档创建日期对查询结果进行排序。
  • 为什么说创建日期?问题的作者没有说按时间排序他的文件。
  • @EugeneGriaznov zelig74 按 ID 排序的愿望并没有告诉你他想要按时间排序?按 ID 排序时,您希望按哪种顺序?
  • @Parziphal,我希望按 ID 排序时按时间顺序随机排列。
【解决方案2】:

这里接受的答案不正确。

来自here

自动生成的 ID 不提供任何自动排序。

是的,因为您不知道自动生成的 ID 是什么。这并不意味着默认排序顺序不是按 id,事实上,另一个文档页面说的完全相反:

来自here

默认情况下,查询检索所有满足查询的文档 按文档 ID 升序排列。您可以指定排序顺序 你的数据使用 orderBy(),你可以限制文档的数量 使用 limit() 检索。

是的,您可以按文档 ID 降序排序:

.orderBy(firebase.firestore.FieldPath.documentId(), 'desc')

J

【讨论】:

    【解决方案3】:

    使用这个根据id降序排列:

    .collection("jobs")
    .orderBy("", "desc")
    

    【讨论】:

    • 不幸的是,这会引发错误:“错误:参数“fieldPath”的值不是有效的字段路径。路径不能为空...”
    猜你喜欢
    • 2020-12-22
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    相关资源
    最近更新 更多