首页 > 解决方案 > 基于 Firestore 更改触发云函数 (Python)

问题描述

每当 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. 添加新文档 - 我将打印作为ADDEDend of callback
  2. 修改现有文档 - 我大多将打印作为ADDED但有时或者更确切地说,在 10 次运行中我得到ADDEDMODIFIED。其次是回调结束
  3. 删除任何文档结束的回调。有时(很少)REMOVED回调结束

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

标签: pythongoogle-cloud-firestoregoogle-cloud-functions

解决方案


限制是这仅适用于 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 文档。


推荐阅读