我们正在使用谷歌的Firestore来处理嵌入式机器配置数据。因为这些数据控制着一个可配置的页面流和许多其他的东西,它被分割成许多子集合。在这个系统中,每台机器都有它自己的顶层文件。然而,当我们要把机器添加到机群中时,要花很长时间,因为我们必须在多个文件中手动复制所有这些数据。有谁知道如何在Python中递归地复制Firestore文档、它的所有子集、它们的文档、子集等。你会有一个顶层的文档参考,以及一个新的顶层文档的名字。
Firestore - 递归复制一个文档和它的所有子集合/文档
1
人关注
1
个评论
你好,你能详细说明一下你是如何更新你的Firestore的所有文件的吗?例如,你的数据结构是使用查找功能吗?[1]你是在一个单一的过程中更新所有的文件吗?如果是这样,你是否尝试过在Cloud Firestore函数触发器的帮助下将其解耦?[2]通过这些函数,你可以定义异步函数来监听文档的变化,并分担计算工作量。 [1]
youtube.com/watch?v=i1n9Kw3AORw&t=438s
[2]
firebase.google.com/docs/functions/...
Noah Martino
发布于
2021-05-05
1
个回答
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"),