当我使用日期(firebase 时间戳)检索数据时,我很难让分页正常工作。
这基本上就是我所做的:
let jobsRef = db.collection("jobs")
.orderBy('createdAt', 'desc')
.limit(QUERY_LIMIT);
jobsRef = jobsRef.startAfter(this.props.jobs[this.props.jobs.length - 1].createdAt);
但是,有时我似乎会收到刚刚收到的退货。我猜是因为日期相似? 那么我怎样才能基本上返回按createdAt排序的作业列表并具有偏移/限制(分页)?
createdAt 看起来像时间戳类型:
23 October 2020 at 17:26:31 UTC+2
当我登录createdAt时,我看到了这个:{seconds: 1603537477, nanoseconds: 411000000}
也许我应该将createdAt存储为unix时间戳?或者解决这个问题的理想方法是什么?
如果多个文档的排序字段可以具有相同的值,则传入该字段的值并不能保证指向唯一的文档。所以你确实可能传递了一条不明确的指令,导致了不想要的结果。
如果可能,我强烈建议将整个文档传递给 Firestore API。这使得 Firestore 从该文档中获取必要的数据,以便唯一/明确地找到您的查询的锚点。
所以代替:
jobsRef.startAfter(this.props.jobs[this.props.jobs.length - 1].createdAt);
做:
jobsRef.startAfter(this.props.jobs[this.props.jobs.length - 1]);
我面临着类似的问题,五小时后我终于找到了解决方案,您需要做的就是将该数字转换为 firestore 的时间戳
import { Timestamp }. from @angular/fire/firestore;
let createdAt: number = 56772766688383;
let timestamp = Timestamp.fromMillis(createdAt);
//then pass that to startAfter
startAfter(timestamp)
我在 Retool 中遇到了类似的问题。
对我来说,问题是我将一个字符串传递给
startAfter
函数,而 createdAt
是一个数字。我所要做的就是将变量转换为数字,一切正常。