Firebase 分页使用时间戳/日期作为 orderBy

问题描述 投票:0回答:3

当我使用日期(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时间戳?或者解决这个问题的理想方法是什么?

这是它在数据库中的外观(当我单击createdAt上的编辑时弹出): enter image description here

reactjs firebase google-cloud-firestore
3个回答
1
投票

如果多个文档的排序字段可以具有相同的值,则传入该字段的值并不能保证指向唯一的文档。所以你确实可能传递了一条不明确的指令,导致了不想要的结果。

如果可能,我强烈建议将整个文档传递给 Firestore API。这使得 Firestore 从该文档中获取必要的数据,以便唯一/明确地找到您的查询的锚点。

所以代替:

jobsRef.startAfter(this.props.jobs[this.props.jobs.length - 1].createdAt);

做:

jobsRef.startAfter(this.props.jobs[this.props.jobs.length - 1]);

0
投票

我面临着类似的问题,五小时后我终于找到了解决方案,您需要做的就是将该数字转换为 firestore 的时间戳

import { Timestamp }. from @angular/fire/firestore;


let createdAt: number = 56772766688383;

let timestamp = Timestamp.fromMillis(createdAt);

//then pass that to startAfter

startAfter(timestamp)



0
投票

我在 Retool 中遇到了类似的问题。

对我来说,问题是我将一个字符串传递给

startAfter
函数,而
createdAt
是一个数字。我所要做的就是将变量转换为数字,一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.