Как использовать Firestore для непрерывной записи новых данных из стороннего API и игнорирования старых данных

# #firebase #google-cloud-firestore

Вопрос:

У меня возникли некоторые проблемы с реализацией некоторого кода на python для отправки данных в Firestore. Я пытаюсь изучить Firestore, создав небольшой проект для домашних животных с погодой. Мой код постоянно запрашивает сторонний погодный API и получает словарь объектов JSON, где каждый объект JSON представляет погоду с 8 утра сегодня до текущего времени сегодня для определенного города. Обычно каждые 30 минут в API добавляется новая точка данных, чтобы показать, как изменились погода и влажность, поэтому данных не так много (например, одна точка данных на 8 утра, одна на 8:30 утра и так далее). Затем я пытаюсь отправить эти данные в firestore. В моем магазине firestore есть коллекция под названием «Погода», и в этой коллекции много документов с названием «Погода — Сан — Франциско, Калифорния, с 8 утра до текущего времени», «Погода — Остин, Техас, с 8 утра до текущего времени-Дата: 9/1/2021» и т. Д. Каждый документ должен представлять собой список объектов JSON (или я могу использовать словарь словарей, где ключевым является время, что проще реализовать), где каждый объект представляет погоду на определенное время (т. Е. 8 утра, 8:30 утра, 9 утра). Проблема, с которой я сталкиваюсь при написании кода для записи в Firestore, заключается в том, что я выполняю слишком много вызовов чтения/записи (дорого), поскольку мой код для записи в Firestore выполняется непрерывно, и большая часть данных в ответе от стороннего API-это прошлые данные, которые продолжают снова и снова записываться в Firestore. В идеале я хотел бы игнорировать старые данные о погоде, которые уже должны существовать в Firestore, и записывать только новые данные о погоде. Мой код:

     # wd is our list of weather data for from 8 am today to current time today for many cities where each element looks like: 
    # ("Weather", "Weather - Austin Texas from  8 am to current time - Date: 8/25/2021", {"weather": "95 degrees F", time: "9:30 am PST"})
    # ("Weather", "Weather - Atlanta Georgia from  8 am to current time - Date: 8/25/2021", {"weather": "72 degrees F", time: "11:30 am PST"})

    for wd in write_data:
                ref = firestore.client().collection(wd[0]).document(wd[1])
                doc = ref.get()
                if doc.exists:
                    # append new item to list. 
                    # The goal here is to only add new items to list, ignoring old items. 
                    # I thought firestore.ArrayUnion would only add new items.
                    ref.set({“weather” : firestore.ArrayUnion([wd[2]])}) 
                else:
                    ref.set({“weather”: [wd[2]]}) #  add the first item to list
 

Приведенный выше код не работает. Это не дает конечного результата, которого я ожидаю. Он непрерывно записывает некоторые данные, затем перезаписывает себя, и это дорого, потому что он выполняет много ненужных вызовов. Хотелось бы получить несколько указаний в правильном направлении. Спасибо!