Javascript 有没有一种方法可以在没有快照的情况下对firebase数据进行分页?

Javascript 有没有一种方法可以在没有快照的情况下对firebase数据进行分页?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我有一个名为activity的firebase集合,里面有4个文档,时间戳分别为2点、3点、4点和5点 当我这样质疑它的时候 let postsQuery = firebase .firestore() .collection(`activity`) .orderBy("timestamp", "desc") .limit(2); 我正确地得到了5点和4点的位置 但是,当我使用以下条件再次调用函数时: //

我有一个名为activity的firebase集合,里面有4个文档,时间戳分别为2点、3点、4点和5点

当我这样质疑它的时候

let postsQuery = firebase
      .firestore()
      .collection(`activity`)
      .orderBy("timestamp", "desc")
      .limit(2);
我正确地得到了5点和4点的位置

但是,当我使用以下条件再次调用函数时:

// oldest post is the 4 o'clock document
if (oldestPost) {
      postsQuery = postsQuery.startAfter(oldestPost);
    }
我又拿到了4号和5号文件。如果我将startAFter更改为任何其他筛选器,则返回0个文档


所以我的问题是,我是做错了,还是不能传入document.data()作为筛选器,而需要传入原始文档?

有两个重载:

  • startAfter(snapshot:DocumentSnapshot
    ,我建议您尽可能使用它
  • startAfter(…fieldValues:any[])
    ,您可以只将文档的字段值传递到其中,然后再开始

  • 我建议使用第一个重载的原因是,在某些情况下,可能有多个文档具有相同的字段值。在这种情况下,第一个重载足够聪明,可以使用文档ID消除这些文档之间的歧义,并且不返回任何重叠文档。第二个过载不能保证这一点。

    所以回答我自己的问题: 当我收到帖子时,我只是把它们存储在一个idMap中

    postsQuery
    .get()
    .then((documents) => {
        const typeIdToDocument = {};
        documents.forEach((document) => {
            const data = document.data();
            typeIdToDocument[document.id] = { id: document.id, ...data };
        });
    
    然后,当我传入startAfter时,我使用了post的.data()结果。 然而,当- A) 我传入了原始firebase文档,而不是.data()版本 或者B)我传入了Firebase时间戳,而不是完整的文档

    postsQuery = postsQuery.startAfter(oldestFirebaseTimestamp);
    

    显然,不调用文档上的.data(),并将其用作最早的帖子是有效的。耶!对不起,但是。。。我有点好奇,如果您解决了自己的问题,以及您以前调用
    .data()
    的代码,请您将您的问题更新为原始
    .data()
    代码,以便我们了解您评论背后的上下文?而且,你知道,如果你也能把它贴在一个答案中,并将其标记为已接受,这将有助于其他面临类似问题的人。请,谢谢。谢谢,补充说