Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firestore startAfter()按递减时间戳排序时,以无限滚动方式返回相同的数据_Javascript_Pagination_Google Cloud Firestore_Ionic4 - Fatal编程技术网

Javascript Firestore startAfter()按递减时间戳排序时,以无限滚动方式返回相同的数据

Javascript Firestore startAfter()按递减时间戳排序时,以无限滚动方式返回相同的数据,javascript,pagination,google-cloud-firestore,ionic4,Javascript,Pagination,Google Cloud Firestore,Ionic4,我正在使用Ionic上的Firestore,通过将orderBy()设置为“timestamp”,编写一个按时间顺序排列的用户帖子(最新帖子在顶部)的个人资料页面。当用户到达底部时,我使用Ionic的无限加载来加载更多的帖子,但结果是Firestore一次又一次地加载完全相同的帖子。请帮忙 嗨 抱歉,如果这是一个初学者的问题,但我已经围绕这个问题思考了好几个小时,但都没有用。分页在升序时工作正常,但在降序时加载相同的帖子。我已经考虑过尝试以下替代方案,但它们并不具有成本效益: 当用户到达底部时更

我正在使用Ionic上的Firestore,通过将orderBy()设置为“timestamp”,编写一个按时间顺序排列的用户帖子(最新帖子在顶部)的个人资料页面。当用户到达底部时,我使用Ionic的无限加载来加载更多的帖子,但结果是Firestore一次又一次地加载完全相同的帖子。请帮忙

抱歉,如果这是一个初学者的问题,但我已经围绕这个问题思考了好几个小时,但都没有用。分页在升序时工作正常,但在降序时加载相同的帖子。我已经考虑过尝试以下替代方案,但它们并不具有成本效益:

  • 当用户到达底部时更改限制:这将导致反复阅读所有帖子
  • 按升序执行,但反转数组:这会破坏分页的目的
  • 使用查询(where)获取x timestamp:之前的文档:理论上是可行的,但有点粗糙,我真的想知道startAfter()是如何工作的,因为它已经存在了
  • '''


    问题是,
    startAfter()
    希望参数使用查询游标,而不是您要传递的时间戳

    查询光标标识文档:

    您需要做的是将
    doc
    保存到类级别的变量中,然后将其与下一个变量一起传递:

    // in the class variables at the top
    latestEntry: any;
    
    // then save a reference to it
    this.latestEntry = data[data.length - 1].doc;
    
    // Now you can use the latestEntry to query with startAfter
    .startAfter(this.latestEntry)
    
    这是一般理论。当我自己在一个应用程序中工作时,我使用了


    要做到这一点,需要对代码进行大量重写,这超出了我目前的时间范围,但希望这能帮助您自己解决问题。

    在我的例子中,我添加了如下查询

    query.startAfter(lastId)
    
     collectionReference
            .whereEqualTo("id", someId)
            .orderBy("timestamp", Query.Direction.DESCENDING)
            .limit(5)
            .get()
            .addOnSuccessListener { documentSnapshots ->
                //do some stuff
            }
    
    它应该在哪里

    query = query.startAfter(lastId)
    

    问题是,您必须匹配上一个查询顺序: 字段值的顺序必须“与查询的order by子句的顺序匹配”

    所以如果你先做一个这样的查询

    query.startAfter(lastId)
    
     collectionReference
            .whereEqualTo("id", someId)
            .orderBy("timestamp", Query.Direction.DESCENDING)
            .limit(5)
            .get()
            .addOnSuccessListener { documentSnapshots ->
                //do some stuff
            }
    
    那么您的下一个查询应该是:

    collectionReference
            .whereEqualTo("id", someId) 
            .orderBy("timestamp", Query.Direction.DESCENDING) //FIELD
            .limit(5)
            .startAfter(lastVisible.get("timestamp"))
            .get()
            .addOnSuccessListener { documentSnapshots ->
                //do some stuff
            }
    

    您可以看到startAfter({somecriteria})必须与第一个查询的orderBy({somecriteria})相匹配,您的最后一个文档从该查询中可见,否则,它将再次返回您的第一个查询。

    如果您确保firestore中的时间戳和变量start之间的数据类型相同,则查询应该可以工作。

    我使用doc.timestamp而不是文档本身来解决它。这很奇怪,因为Firestore文档中另有说明。谢谢你的回复!