Операции со скоростным и облачным хранилищем - getDocuments? - PullRequest
0 голосов
/ 07 июня 2018

Транзакции в Cloud Firestore поддерживают получение документа с использованием транзакции .getDocument, но даже при наличии метода .getDocuments, похоже, не существует .getDocuments для получения нескольких документов, которые работают с транзакцией.

У меня есть приложение, похожее на Yelp, использующее базу данных Cloud Firestore со следующей структурой: - Места для оценки называются точками.- Каждое пятно имеет документ в коллекции пятен (идентифицируется уникальным documentID).- Каждое место может иметь коллекцию отзывов, содержащую все отзывы для этого места.- Каждый отзыв идентифицируется собственным уникальным documentID, и каждый обзорный документ содержит рейтинг места.

Ниже приведено изображение моей установки Cloud Firestore с некоторыми данными.enter image description here

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

let db = Firestore.firestore()
db.runTransaction({ (transaction, errorPointer) -> Any? in
    let ref = db.collection("spots").document(self.documentID).collection("reviews")
    guard let document = try? transaction.getDocuments(ref) else {
        print("*** ERROR trying to get document for ref = \(ref)")
        return nil
    }

Xcode состояния: значение типа «Транзакция» не имеет члена «getDocuments».Существует getDocument, который можно использовать для получения одного документа (см. https://firebase.google.com/docs/firestore/manage-data/transactions).

Можно ли получить коллекцию документов в транзакции? Я хотел сделать это, потому что каждое местоУ моего рейтинга (спот) есть средний рейтинг, и всякий раз, когда происходит изменение одного из рейтингов, я хочу вызвать функцию, которая: - запускает транзакцию (выполнено) - читает все текущие обзоры для этого спота (можетне приступайте к работе) - рассчитывает новый средний рейтинг - обновляет спот новым значением среднего рейтинга.

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

1 Ответ

0 голосов
/ 21 июня 2018
  1. Нет.Клиентские библиотеки не позволяют делать запросы внутри транзакций.Вы можете запросить только определенные документы внутри запроса.Вы могли бы сделать что-то действительно хакерское, например, выполнить запрос вне транзакции, а затем запросить каждый отдельный документ внутри транзакции, но я бы не рекомендовал этого.

  2. Что может быть лучше - запустить это на стороне сервера.Как, скажем, с облачной функцией, которая позволяет вам выполнять запросы внутри транзакций.Что еще более важно, вам больше не нужно доверять клиенту, чтобы обновлять среднюю оценку отзыва для ресторана, что является плохой вещью.

  3. Тем не менее, я все же мог бы рекомендовать использовать облачную функциюэто выполняет ту же логику, что и Friendly Eats, когда вы говорите что-то вроде New average = Old average + new review / (Total number of reviews). Если ваше приложение станет действительно популярным, вы убедитесь, что вы не выполняете чрезмерное чтение.

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