如何解决Firestore - 递归复制文档及其所有子集合/文档
我们将 Google 的 Firestore 用于嵌入式机器配置数据。由于此数据控制可配置的页面流和许多其他内容,因此它被分成许多子集合。在这个系统中,每台机器都有自己的顶级文档。然而,当我们将机器添加到机群时需要很长时间,因为我们必须手动复制多个文档中的所有这些数据。有谁知道如何在 Python 中递归复制 Firestore 文档、所有它的子集合、它们的文档、子集合等。您将有一个顶级文档引用以及新顶级文档的名称。
解决方法
您可以使用这样的方法来递归地从一个集合读取和写入另一个集合:
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"),)
batch.commit()
分批写入,这节省了大量时间(在我的例子中,它完成的时间比 set 快了一半)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。