Получает ли запрос коллекции Firestore обновления для всех объектов в запросе?

# #firebase #google-cloud-firestore

Вопрос:

Я пытаюсь прояснить семантику обновлений моментальных снимков запросов Firestore в связи с изменением документов. В документе «Прослушивание нескольких документов в коллекции» говорится, что:

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

Мой вопрос в том, что если документ, который уже был в моментальном снимке, обновляется, всегда ли он будет вызывать новый моментальный снимок запроса? Даже если изменение документа не имеет ничего общего с исходным запросом? Это где-нибудь задокументировано? (В частности, каково определение «изменение результатов запроса»?)

Рассмотрим случай с несколькими существующими документами в коллекции. Начните с запроса всех документов, например:

 db.collection("cities").onSnapshot(snapshot => { ... })
 

Теперь, если в коллекции создается новый документ или документ удаляется, onSnapshot обратный вызов будет повторно вызван с этими изменениями, поскольку «результаты запроса» отличаются.

Но что произойдет, если документ в этой коллекции примеров будет изменен после вызова первоначального onSnapshot обратного вызова? (Например, в один из документов «города» добавляется новое свойство.) Будет onSnapshot ли всегда вызываться обратный вызов, чтобы сообщить об этом измененном документе? Считается ли это изменением «результатов запроса»? Набор возвращаемых документов не отличается, поэтому, похоже, что такого рода изменения могут не быть указаны в запросе на сбор?

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

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

Но я не могу найти аналогичной ясности в документации по моментальным снимкам коллекции.

Ответ №1:

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

Есть три случая:

  1. Обновление документа не меняет того факта, что документ возвращается запросом. В этом случае обработчик моментального снимка получит новый снимок запроса, который будет содержать обновленный документ. Таким образом, даже если «возвращенный набор документов не отличается», обработчик моментального снимка получит новый снимок запроса.

Пример: Ваш запрос db.collection("cities").where("state", "==", "CA").onSnapshot(snapshot => { ... }) , и вы меняете только название города, например, или добавляется новое свойство.

  1. Обновление документа удаляет документ из результатов запроса. В этом случае обработчик моментального снимка получит новый снимок запроса без обновленного документа.

Пример: Ваш запрос есть db.collection("cities").where("state", "==", "CA").onSnapshot(snapshot => { ... }) , и вы меняете состояние на значение, отличное от CA .

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

Пример: Ваш запрос есть db.collection("cities").where("state", "==", "CA").onSnapshot(snapshot => { ... }) , и вы меняете значение состояния на CA .


При просмотре отрывка из документа:

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

Приведенный выше случай 1 соответствует «изменено», случай 2 — «удалено» и случай 3 — «добавлено».