Каково количество прочитанных данных для прослушивания запроса cloud_firestore в реальном времени и можно ли это сделать лучше?

#firebase #flutter #google-cloud-firestore

#firebase #флаттер #google-cloud-firestore

Вопрос:

Представьте, что у меня есть следующий псевдокод в flutter / dart :

   Stream<List<T>> list() {
      Query query = Firestore.instance.collection("items");
      return query.snapshots().map((snapshot) {
        return snapshot.documents.map((doc) {
          return standardSerializers.deserializeWith(serializer, doc.data());
        }).toList();
      });
  }
  

Я прослушиваю всю коллекцию «элементов» в моей базе данных. Допустим, для простоты всего есть 10 документов, и я постоянно прослушиваю изменения.

Я слушаю этот поток где-то в своем коде. Допустим, этот запрос возвращает все 10 «элементов» при первом вызове, например. Это считается как 10 чтений, хорошо. Если я изменяю один из этих документов непосредственно в веб-интерфейсе firestore (или где-либо еще), прослушиватель запускается, и у меня создается впечатление, что подсчитывается еще 10 чтений, хотя я изменил только один документ. Я проверил вкладку использования моего облачного проекта, и у меня есть это подозрение.

  1. Это тот случай, когда учитываются чтения 10 документов, даже если для этого запроса изменен только один документ?

  2. Если ответ положительный, следующий вопрос будет «Представьте, что я хотел бы иметь два вызова list(), один с OrderBy «рейтинг», другой с OrderBy «время» (случайные атрибуты), один из этих документов изменяется, это будет означать 20 чтений для 1 обновления»?

Либо я что-то упускаю, либо firestore не адаптирован для моего использования, либо я должен изменить свою архитектуру, либо я ошибся в подсчете.

  1. Есть ли какой-либо способ просто получить измененные документы? (Очевидно, я могу реализовать кэш, локальную базу данных и систему временных меток, чтобы избежать бесполезных чтений, если firestore этого не делает)

pubspec.yaml =>

 firebase_database: ^4.0.0
firebase_auth: ^0.18.0 1
cloud_firestore: ^0.14.0 2
  

Вероятно, это относится ко всем приложениям, таким как iOS и Android, поскольку это, по сути, более общий вопрос «firestore», но, например, в flutter / dart, поскольку это то, что я использую на всякий случай, если это как-то связано с плагином flutterfire.

Заранее благодарю вас.

Ответ №1:

Q1: Это тот случай, когда учитываются чтения 10 документов, даже если для этого запроса изменен только один документ?

Нет, как подробно описано в документации:

Когда вы прослушиваете результаты запроса [Примечание: (или коллекцию или вложенную коллекцию)], с вас взимается плата за чтение каждый раз, когда документ в наборе результатов добавляется или обновляется. С вас также взимается плата за чтение, когда документ удаляется из набора результатов, потому что документ изменился. (Напротив, когда документ удаляется, с вас не взимается плата за чтение.)

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

Q2: Если ответ положительный, следующий вопрос…

Ответ на вопрос 1 — «нет» 🙂

Q3: Есть ли какой-либо способ просто получить измененные документы?

Да, смотрите эту часть документа, в которой объясняется, как отслеживать фактические изменения в результатах запроса между снимками запроса, вместо того, чтобы просто использовать снимок всего запроса. Для Flutter вы должны использовать docChanges свойство.

Комментарии:

1. Я не понял эту часть In contrast, when a document is deleted, you are not charged for a read , если документ удален, не изменяется ли набор результатов? Это противоречит предыдущему утверждению

2. @TSR Если документ удален, он не добавляется и не обновляется, следовательно, плата не взимается. В документе говорится: «с вас взимается плата за чтение каждый раз, когда документ в наборе результатов добавляется или обновляется»