Firestore - 递归复制一个文档和它的所有子集合/文档

1 人关注

我们正在使用谷歌的Firestore来处理嵌入式机器配置数据。因为这些数据控制着一个可配置的页面流和许多其他的东西,它被分割成许多子集合。在这个系统中,每台机器都有它自己的顶层文件。然而,当我们要把机器添加到机群中时,要花很长时间,因为我们必须在多个文件中手动复制所有这些数据。有谁知道如何在Python中递归地复制Firestore文档、它的所有子集、它们的文档、子集等。你会有一个顶层的文档参考,以及一个新的顶层文档的名字。

1 个评论
你好,你能详细说明一下你是如何更新你的Firestore的所有文件的吗?例如,你的数据结构是使用查找功能吗?[1]你是在一个单一的过程中更新所有的文件吗?如果是这样,你是否尝试过在Cloud Firestore函数触发器的帮助下将其解耦?[2]通过这些函数,你可以定义异步函数来监听文档的变化,并分担计算工作量。 [1] youtube.com/watch?v=i1n9Kw3AORw&t=438s [2] firebase.google.com/docs/functions/...
python
google-cloud-firestore
firebase-admin
Noah Martino
Noah Martino
发布于 2021-05-05
1 个回答
cristi
cristi
发布于 2021-06-03
已采纳
0 人赞同

你可以使用类似这样的东西,从一个集合中递归读写到另一个集合。

def read_recursive(
    source: firestore.CollectionReference,
    target: firestore.CollectionReference,
    batch: firestore.WriteBatch,
) -> None:
    global batch_nr
    for source_doc_ref in source:
        document_data = source_doc_ref.get().to_dict()
        target_doc_ref = target.document(source_doc_ref.id)
        if batch_nr == 500:
            log.info("commiting %s batched operations..." % batch_nr)
            batch.commit()
            batch_nr = 0
        batch.set(
            reference=target_doc_ref,
            document_data=document_data,
            merge=False,
        batch_nr += 1
        for source_coll_ref in source_doc_ref.collections():
            target_coll_ref = target_doc_ref.collection(source_coll_ref.id)
            read_recursive(
                source=source_coll_ref.list_documents(),
                target=target_coll_ref,
                batch=batch,
batch = db_client.batch()
read_recursive(
    source=db_client.collection("src_collection_name"), 
    target=db_client.collection("target_collection_name"),