根据Firestore更改触发云功能(Python)

时间:2019-09-19 16:07:48

标签: python google-cloud-firestore google-cloud-functions

只要在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')

现在,当我在Firestore文档中进行更改时,例如:

  1. 添加新文档-我以 ADDED (添加)和回调结束的方式获得打印信息。
  2. 修改现有文档-我通常以 ADDED 获得打印内容,但是有时甚至每10次运行一次,我同时获得 ADDED MODIFIED 。然后是回调结束
  3. 删除任何文档-回调结束。有时(很少)同时已删除回调结束

我无法理解这种行为,也不知道如何处理无法执行的打印操作。

1 个答案:

答案 0 :(得分:0)

限制是仅Node.js,因此仅Javascript。我认为它仍然适用并且值得您研究,因此尽管您的问题基于Python,但在这里共享它是最佳选择。

我认为Cloud Functions在这里对您非常有用。您可以设置触发器,以在您提到的每件事上运行功能。

添加可以通过onCreate处理。 修改后可以通过onUpdate处理。 已删除-通过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 ...
    });

对于上面的示例,您将获得文档的前后状态,因此您不仅可以知道它已更改,还可以知道更改了什么。

示例代码直接来自Cloud Functions here的文档。