【问题标题】:How to bulk delete specific documents from Firestore in Python如何在 Python 中从 Firestore 中批量删除特定文档
【发布时间】:2019-09-24 02:59:03
【问题描述】:

如果我有一个文档 ID 列表并且我想从 Firestore 中删除它们,那么最有效的方法是什么?我目前正在列表中使用循环:

document_ids = ["xyz123", "abc0987", "tvu765", ...] # could be up to 30 IDs

for id in document_ids:
   database.collection("documents").document(id).delete()

这是通过从前端到 Flask 路由的 AJAX 调用完成的,一旦完成,它会发回响应,但是当有 20+ id 时,可能需要几秒钟才能完成该过程。

有没有办法说,在这里,从这个集合中删除这些?

【问题讨论】:

    标签: python io google-cloud-firestore multiprocessing


    【解决方案1】:

    也许您可以使用multiprocessing 来加速 io-bound 操作。

    使用多处理加速

    Refer: YouTube Video

    import multiprocessing
    import time
    from google.cloud import firestore
    
    document_ids = ["xyz123", "abc0987", "tvu765", ...] # could be up to 30 IDs
    def delete_doc(doc_id):
        database = firestore.Client() 
        database.collection("documents").document(doc_id).delete()
    
    t_start = time.perf_counter()
    processes = list()
    for id in document_ids:
        p = multiprocessing.Process(target=delete_doc, args=[id,])
        p.start()
        processes.append(p)
    
    for p in processes:
        p.join()
    
    t_finish = time.perf_counter()
    
    print("Total Elapsed Time: {} s".format(round(t_finish - t_start, 3)))
    

    【讨论】:

    • @Ari 请让我知道这是否有效。由于我无法使用类似的设置,因此无法进行正确的测试。
    • 是的,这行得通!我不得不进行一些更改,但基本上 99% 是您的代码,非常感谢
    • 请注意,这不会扩大到很高的规模。由于这是为每个文档创建一个新进程,并同时启动它们,因此它将受到系统上可用内存量的限制。一个新的进程可能相当大,机器可能会搅动,使一切运行得更慢。
    • @DougStevenson 这是真的,我可以限制吗?如果我给它 30 个 ID,它可能会尝试 30 个进程吗?我可以一次批量说 4 个左右吗?
    • 您绝对可以批量处理 ID 以限制最大内存消耗量。
    【解决方案2】:

    你现在正在做的几乎是唯一的方法。没有类似 SQL 的“delete from ... where ...”命令。您必须使用其 ID 删除每个文档。

    【讨论】:

    • 这听起来不错。但正如 Doug 所说,没有“条件删除”操作,因此您要触发 1,000 个单独的删除操作,这是正确的方法(而且确实很快)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多