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