Firestore кеширует результаты запроса? - PullRequest
0 голосов
/ 20 июня 2019

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

Я покажу 20 результатов на странице, используя курсоры запросов .

Если мой пользователь начинает со страницы 1 и нажимает кнопку Next, пока не увидит страницу 5, он прочтет все 100 документов.

ВОПРОС

Если он нажмет кнопку Previous, возвращаясь со страницы 5 до страницы 1 снова, с меня будет взиматься плата за 180 операций чтения, или у Firestore будет какой-то период кэширования, когда он будет возвращать те же результаты без новых операций чтения?

180 = Страницы с 1 по 4 дважды и по одному разу.

Примечание: Я бы использовал метод get() на каждой странице с соответствующим startAfter().

Я спрашиваю это, потому что на странице операций с ценами есть информация о результатах прослушивания запроса:

Прослушивание результатов запроса

Cloud Firestore позволяет прослушивать результаты запроса и получать обновления в реальном времени при изменении результатов запроса.

Когда вы прослушиваете результаты запроса, вы платите за чтение каждый раз, когда документ в наборе результатов добавляется или обновляется. Вы также платите за чтение, когда документ удален из набора результатов, потому что документ изменился. (Напротив, при удалении документа с вас не взимается плата за чтение.)

Кроме того, , если прослушиватель отключен более чем на 30 минут (например, если пользователь переходит в автономный режим), с вас будет взиматься плата за чтение, как если бы вы выполнили новый запрос.

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

1 Ответ

1 голос
/ 20 июня 2019

Поскольку вы не настраиваете прослушиватель, каждый вызов get() будет получать последние данные с сервера, и вы будете платить за эти чтения. Есть два способа избежать оплаты за новые чтения каждый раз:

  1. Используйте прослушиватель query.onSnapshot(...), который будет постоянно обновляться при изменении данных.
  2. Используйте query.get({source: "cache"}) для выборки из локального кэша. Подробнее см. GetOptions .

Для (2) если в кеше нет данных, get() вернет моментальный снимок без документов, так что вам нужно либо отслеживать, какие страницы вы уже получили, либо выполнить какой-то откат:

let snap = await q.get({source: "cache"});
if (snap.empty) {
  // cache didn't have anything, so try a fetch from server instead
  snap = await q.get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...