【问题标题】:Firebase pagination using a timestamp/date as the orderByFirebase 分页使用时间戳/日期作为 orderBy
【发布时间】:2020-10-25 01:42:07
【问题描述】:

当我使用日期(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 上的编辑时弹出):

【问题讨论】:

    标签: reactjs firebase google-cloud-firestore


    【解决方案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]);
    

    【讨论】:

    • 问题是this.props.jobs[this.props.jobs.length - 1] 返回的不是firebase 对象,而是我工作的标准js 对象。我这样做是因为我使用 NextJs,当我尝试在 getInitialProps() 中返回 firebase 对象时,我遇到了一些循环结构问题。 (不确定您对 nextJs 的熟悉程度)
    • 这确实是个问题。我建议保留 DocumentSnapshot 并将其传递进去。如果不可能,请尝试订购/传递文档 ID 作为额外条件,这样可以用来消除文档之间的歧义。
    • 是的,似乎没有什么不同,我找不到传递文件的解决方案。我想我可以尝试 Date.now() 存储 unix 时间戳,我希望这应该很容易分页
    • Firestore Timestamp 类型比 Unix 毫秒时间戳更准确,因此不应该让它变得更好。但是如果不查看实际数据、它是如何初始化的、它在数据库中的样子以及它在查询输出中的显示方式以及您的问题,就很难确定。
    • 因此,当我使用 createdAt 时,它是一种 unix 时间戳类型格式,例如 1603558041210,那么它可以完美运行!在我将其更改为 unix 时间戳之前,我使用 createdAt 的图像更新了问题
    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2014-08-04
    • 2018-12-09
    • 1970-01-01
    • 2020-11-17
    • 2021-04-14
    • 2016-10-27
    相关资源
    最近更新 更多