Paginate с Firestore - PullRequest
       0

Paginate с Firestore

1 голос
/ 21 апреля 2019

Я хочу разбить запрос на страницы в 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?

Кажется, что все учебники направлены непосредственно на описание того, как выполнять нумерацию страниц, но я не могу этого понять. Правильно ли мое определение нумерации страниц? Или они называют эту функцию пагинацией, когда это действительно функция «получить следующий кусок данных» ...?

1 Ответ

1 голос
/ 21 апреля 2019

Я не знаю, сколько всего документов в моем запросе, поэтому я не могу отобразить массив чисел для моего пользователя

В Firestore API нет запроса на подсчет. Если вам нужно знать общее количество документов, вам нужно будет либо загрузить все документы, либо сохранить счетчик при выполнении обновлений. Поскольку разбиение на страницы предназначено для предотвращения загрузки всех документов, я бы взглянул на документацию по распределенным счетчикам .

Даже если бы у меня был этот массив, как бы я извлек определенный фрагмент, который не находится непосредственно рядом с предыдущим загруженным фрагментом? Пример, как запросить страницу 8, если мой пользователь в данный момент находится на странице 1?

API Firestore в целом не идеален для нумерации страниц на основе смещения. Он гораздо больше подходит для бесконечной прокрутки к загрузке данных по требованию. Если вы хотите реализовать разбиение на страницы, вы можете рассмотреть возможность использования SDK на стороне сервера, который поддерживает основанные на смещении запросы . Но даже это, вероятно, не то, что вам нужно, так как вы платите за все документы, которые смещение «пропускает».

Единственный известный мне обходной путь - хранить список ключей (и, возможно, других полей, по которым вы отсортировали) для каждой прочитанной страницы. Или сохранить отдельную коллекцию со всеми ключами (так как вы можете поместить довольно много из них в ограничение размера документа 1 МБ). Возможно, вы также захотите взглянуть на реализацию FirestorePagingAdapter FirebaseUI , которая уже реализует нумерацию страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...