#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 чтений, хотя я изменил только один документ. Я проверил вкладку использования моего облачного проекта, и у меня есть это подозрение.
-
Это тот случай, когда учитываются чтения 10 документов, даже если для этого запроса изменен только один документ?
-
Если ответ положительный, следующий вопрос будет «Представьте, что я хотел бы иметь два вызова list(), один с OrderBy «рейтинг», другой с OrderBy «время» (случайные атрибуты), один из этих документов изменяется, это будет означать 20 чтений для 1 обновления»?
Либо я что-то упускаю, либо firestore не адаптирован для моего использования, либо я должен изменить свою архитектуру, либо я ошибся в подсчете.
- Есть ли какой-либо способ просто получить измененные документы? (Очевидно, я могу реализовать кэш, локальную базу данных и систему временных меток, чтобы избежать бесполезных чтений, если 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 Если документ удален, он не добавляется и не обновляется, следовательно, плата не взимается. В документе говорится: «с вас взимается плата за чтение каждый раз, когда документ в наборе результатов добавляется или обновляется»