Какой лучший способ разбить на страницы и отфильтровать большой набор данных в Firebase? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть большая коллекция Firestore с 10 000 документов.

Я хочу показать эти документы в виде таблицы, просматривая и фильтруя результаты по 25 за раз.

Моя идея, чтобы ограничить «чтения» (и, следовательно, расходы), было запрашивать только 25 документов за один раз (используя метод «лимит»), и загружать следующие 25 документов при смене страницы.

Но есть проблема. Чтобы показать количество страниц, мне нужно знать общее количество документов, и я был бы вынужден запросить все документы, чтобы найти это число.

Я мог бы выбрать бесконечный свиток, но даже в этом case я никогда не узнаю общее количество результатов, найденных моим фильтром.

Другой вариант - запросить все документы в начале, а затем выполнить подкачку и фильтрацию с помощью клиента.

Итак, каков наилучший способ отображения данных в такой ситуации путем оптимизации производительности и затрат?

Спасибо!

Ответы [ 3 ]

1 голос
/ 03 мая 2020

В документации Firestore вы найдете страницу, посвященную Разбиение данных на страницы с помощью курсоров запросов .

Вставьте здесь пример, который "объединяет курсоры запросов с методом limit()".

var first = db.collection("cities")
        .orderBy("population")
        .limit(25);

return first.get().then(function (documentSnapshots) {
  // Get the last visible document
  var lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1];
  console.log("last", lastVisible);

  // Construct a new query starting at this document,
  // get the next 25 cities.
  var next = db.collection("cities")
          .orderBy("population")
          .startAfter(lastVisible)
          .limit(25);
});

Если вы выберете бесконечный свиток, вы можете легко узнать, достигли ли вы конца коллекции, посмотрев на значение documentSnapshots.size. Если он меньше 25 (значение, использованное в примере), вы знаете, что достигли конца собрания.


Если вы хотите показать общее количество документов в собрании, Лучше всего использовать распределенный счетчик , который содержит количество документов, как объяснено в этом ответе: { ссылка }

0 голосов
/ 03 мая 2020

Полагаю, вы бы использовали Mat-Paginator, а следующая кнопка отключена, потому что вы не можете указать точную длину? В этом случае или нет, простой обходной путь для этого состоит в том, чтобы получать (pageSize +1) документы каждый раз из Firestore, отсортированного по полю (например, createAt), так что после загрузки новой страницы у вас всегда будет один документ на следующей странице, которая активирует кнопку «Далее» на странице.

0 голосов
/ 03 мая 2020

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

Однако сам API пейджинга вам не поможет. Вы должны отслеживать это самостоятельно, что не очень легко, особенно для гибких запросов, которые могут иметь любое количество фильтров.

...