[英]Is there a way to paginate firebase data without a snapshot?
我有一個名為活動的 firebase 集合,里面有 4 個文檔,時間戳分別為 2、3、4 和 5 點。
當我這樣查詢時
let postsQuery = firebase
.firestore()
.collection(`activity`)
.orderBy("timestamp", "desc")
.limit(2);
我正確地得到了 5 點和 4 點的帖子。
但是,當我再次使用以下條件調用 function 時:
// oldest post is the 4 o'clock document
if (oldestPost) {
postsQuery = postsQuery.startAfter(oldestPost);
}
我再次獲得了 4 和 5 文件。 如果我將 startAFter 更改為任何其他過濾器,我會返回 0 個文檔。
所以我的問題是,我是不是做錯了,或者我不能傳入 document.data() 作為過濾器,而是需要傳入原始文檔?
所以回答我自己的問題:當我收到我的帖子時,我只是將它們存儲在一個 idMap 中
postsQuery
.get()
.then((documents) => {
const typeIdToDocument = {};
documents.forEach((document) => {
const data = document.data();
typeIdToDocument[document.id] = { id: document.id, ...data };
});
然后當我傳入一個 startAfter 時,我使用了帖子的 .data() 結果。 但是,它在以下情況下起作用 - A)我傳入了原始 firebase 文檔,而不是 .data() 版本或 B)我傳入了 Firebase 時間戳,而不是完整文檔
postsQuery = postsQuery.startAfter(oldestFirebaseTimestamp);
startAfter
有兩個重載:
startAfter ( snapshot: DocumentSnapshot < any > )
,這是我建議您盡可能使用的方法startAfter (... fieldValues: any [] )
,您可以將文檔的字段值傳遞到其中,然后開始。我推薦第一個重載的原因是可能存在多個文檔具有相同字段值的情況。 在這種情況下,第一個重載足夠聰明,可以使用文檔 ID 來消除它們之間的歧義,並且不會返回任何重疊的文檔。 第二次重載不能保證這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.