首页 > 解决方案 > 如何限制和排序 Firestore 中的文档 ID?

问题描述

我有一个集合,其中文档由日期唯一标识,我想获取最近的 n 个文档。我的第一个想法是使用日期作为文档 ID,然后我的查询将按 ID 降序排序。类似的东西.orderBy(FieldPath.documentId, descending: true).limit(n)。这不起作用,因为它需要一个无法创建的索引,因为__name__ only indexes are not supported.

我的下一次尝试是使用.limitToLast(n)默认排序,此处记录了该排序。

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

根据文档中的那个片段,.limitToLast(n)应该可以工作。但是,因为我没有指定排序,所以它说我不能限制结果。为了解决这个问题,我试过.orderBy(FieldPath.documentId).limitToLast(n)了,应该是等价的。出于某种原因,这给了我一个错误,说我需要一个索引。我无法创建它的原因与我无法创建前一个的原因相同,但我认为我不需要这样做,因为它们必须已经具有这样的索引才能实现默认排序。

我是否应该放弃并将文档 ID 作为字段复制到文档中,这样我就可以按这种方式排序?我知道从算法的角度来看,做我想做的事情应该很容易,但我无法弄清楚如何使用 API 来做。我错过了什么吗?

编辑:我没有意识到这很重要,但我正在使用flutterfire firestore library

标签: firebasefluttergoogle-cloud-firestore

解决方案


根据我的发现:

FieldPath.documentId 与 documentId 不匹配,但与 refPath 不匹配(如果传递了文档引用,它将自动获取)。

因此,由于文档将按时间戳排序,因此创建一个timestamp fieldvalueforcreatedAt而不是人类可读的字符串会更理想,因为该字符串易于对字符串的值进行字符串长度排序。

从那里,您可以简单地按日期排序并限制到最后。您可以按照自己的意愿保留文档 ID。


推荐阅读