Облачная функция триггера на основе изменений Firestore (Python) - PullRequest
0 голосов
/ 19 сентября 2019

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

Я пытаюсь все это на python.

Фрагмент кода:

ref = db.collection('country').document(city_id)
ref.update(body_json)
ref.on_snapshot(callback)

def callback(col_snapshot, changes, read_time):
    for change in changes:
        if change.type.name == 'ADDED':
            print('ADDED')
        elif change.type.name == 'MODIFIED':
            print('MODIFIED')
        elif change.type.name == 'REMOVED':
            print('REMOVED')
    print('end of callback')

Теперь, когда я внесу изменения в документ пожарного депо, например:

  1. Добавить новый документ - я получу печать как ДОБАВЛЕНО и конец обратного вызова .
  2. Изменить существующий документ - я в основном получаю распечатку как ДОБАВЛЕНО , но иногда, а точнее один раз в 10 прогонов, я получаю ADDED и MODIFIED .затем конец обратного вызова .
  3. Удалить любой документ - конец обратного вызова .Иногда (редко) оба УДАЛЕН и конец обратного вызова .

Я не могу понять это поведение и не знаю, как с этим справитьсявыполнение печати. ​​

1 Ответ

0 голосов
/ 19 сентября 2019

Ограничение - это только Node.js, поэтому только Javascript.Я думаю, что это все еще применимо и стоит того, чтобы вы на него посмотрели, поэтому поделитесь им здесь, так как, несмотря на ваш вопрос о том, что он основан на Python, это лучший вариант.

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

Добавленный может быть обработан onCreate.Изменено может быть обработано с помощью onUpdate.Removed - by onDelete.

Вы в основном настроили функции, которые выглядят следующим образом:

exports.updateUser = functions.firestore
    .document('users/{userId}')
    .onUpdate((change, context) => {
      // Get an object representing the document
      // e.g. {'name': 'Marie', 'age': 66}
      const newValue = change.after.data();

      // ...or the previous value before this update
      const previousValue = change.before.data();

      // access a particular field as you would any JS property
      const name = newValue.name;

      // perform desired operations ...
    });

Вы получили до и после состояния документа для примера выше, так что вы 'Я смогу не только знать, что это было изменено, но и что было изменено.

Пример кода был взят прямо из документации по облачным функциям здесь .

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