如何使用Python在Firestore中下载一个大型集合,而不出现503错误?

如何使用Python在Firestore中下载一个大型集合,而不出现503错误?,python,google-cloud-firestore,Python,Google Cloud Firestore,尝试使用python计算firestore集合中的文档数。当我使用db.collection('xxxx”).stream()时,我得到以下错误: 503 The datastore operation timed out, or the data was temporarily unavailable. 大约进行了一半。工作正常。代码如下: docs = db.collection(u'theDatabase').stream() count = 0 for doc

尝试使用python计算firestore集合中的文档数。当我使用
db.collection('xxxx”).stream()时,我得到以下错误:

 503 The datastore operation timed out, or the data was temporarily unavailable.
大约进行了一半。工作正常。代码如下:

    docs = db.collection(u'theDatabase').stream()
    count = 0
    for doc in docs:
        count += 1
    print (count)

每次我在大约73000条记录上收到503错误。有人知道如何克服20秒超时吗?

尝试使用递归函数批处理文档检索,并将其保持在超时范围内。以下是基于以下内容的示例:


尽管Juan的答案适用于基本计数,但如果您需要更多来自Firebase的数据,而不仅仅是
id
(一个常见的用例是不通过GCP的数据的完全迁移),递归算法将消耗您的内存

所以我把Juan的代码转换成了一个标准的迭代算法。希望这对其他人有所帮助

limit=1000#如果它占用了太多的RAM,则减少该值
def stream_集合_循环(集合、计数、游标=无):
尽管如此:
docs=[]#非常重要。这将释放递归算法中产生的内存。
如果光标:
docs=[中快照的快照]
collection.limit(limit).order_by(''名称''.'').start_after(游标).stream()]
其他:
docs=[集合中快照的快照.限制(limit).order_by(''名称''.'').stream()]
对于文档中的文档:
打印(文档id)
打印(计数)
#这里的“doc”已经是一个“DocumentSnapshot”,所以你可以在上面调用“to_dict”来获取整个文档。
处理数据和日志错误(如果有)(文档)
计数=计数+1
如果len(docs)=限制:
游标=单据[限额-1]
持续
打破
流\u集合\u循环(db\u v3.collection('collection'),0)

如果您认为这是一个bug,请直接联系Firebase支持。谢谢Juan!这样做了。它很有效。您知道哪种方法可以引发stream()限制错误?我不记得确切的异常。可能尝试强制它先出现,记下名称,然后让autocomplete为您写出。效果很好,比Firestore文档更有用。谢谢!我花了更多时间开发了一个“随时可用”的“用于与处于相同情况的任何人共享的功能。您只需从中复制和粘贴即可
from google.cloud import firestore

# Project ID is determined by the GCLOUD_PROJECT environment variable
db = firestore.Client()


def count_collection(coll_ref, count, cursor=None):

    if cursor is not None:
        docs = [snapshot.reference for snapshot
                in coll_ref.limit(1000).order_by("__name__").start_after(cursor).stream()]
    else:
        docs = [snapshot.reference for snapshot
                in coll_ref.limit(1000).order_by("__name__").stream()]

    count = count + len(docs)

    if len(docs) == 1000:
        return count_collection(coll_ref, count, docs[999].get())
    else:
        print(count)


count_collection(db.collection('users'), 0)