Я хочу разбить запрос на страницы в Firestore, потому что у меня очень большая коллекция (растет более 20 тыс. Документов). Под нумерацией страниц я подразумеваю отображение массива чисел для моего пользователя, если он нажимает на одно из них, он перенаправляет его на определенный фрагмент моей коллекции и выбирает этот фрагмент только тогда, когда он щелкает. Например, если у меня есть 100 документов, и я хочу отобразить 10 на страницу, у меня есть массив чисел от 1 до 10. Каждый раз, когда пользователь нажимает, он загружает 10 продуктов.
Я реализовал бесконечную прокрутку с легкостью благодаря методу startAfter()
с этим doc для курсоров запросов.
Однако, пытаясь следовать той же документации для нумерации страниц, я просто не понимаю. Я также пытался следовать этому учебнику .
Это мой код:
let filteredProductsCollection = new Promise(function(resolve, reject) {
productsCollection
.orderBy("productName")
.where(
req.query.where.field,
req.query.where.comparison,
req.query.where.value
)
.startAfter(
req.query.lastProduct
)
.limit(req.query.limit)
.get()
.then(collection => resolve(collection))
.catch(err => reject(err));
}
Тогда я беру обещание и сохраняю последний документ
.then(snapshot => {
let snapshots = {
last
};
snapshot.forEach(doc => {
snapshots[doc.id] = {
...doc.data(),
id: doc.id
};
});
res.status(200).send(data)
})
При этом выбирается следующая порция продуктов с учетом текущей порции (сохраненной в lastProduct), что позволяет мне выполнять бесконечную прокрутку, которая работает отлично.
Моя главная проблема в том, что я понятия не имею, как перейти от этого к функции нумерации страниц. Два основных вопроса:
- Я не знаю, сколько всего документов в моем запросе, поэтому я не могу отобразить массив чисел для моего пользователя
- Даже если бы у меня был этот массив, как бы я извлек конкретный фрагмент, который не находится непосредственно рядом с предыдущим загруженным фрагментом? Например, как запросить страницу 8, если мой пользователь в данный момент находится на странице 1?
Кажется, что все учебники направлены непосредственно на описание того, как выполнять нумерацию страниц, но я не могу этого понять. Правильно ли мое определение нумерации страниц? Или они называют эту функцию пагинацией, когда это действительно функция «получить следующий кусок данных» ...?