【问题标题】:How to handle that Firestore returns document items in inconsistent order如何处理 Firestore 以不一致的顺序返回文档项
【发布时间】:2022-01-03 22:20:09
【问题描述】:

假设我在 Firestore 集合中存储了下表:

AAA BBB CCC
6   1   15
3   19  83
100 4   2

我想阅读整个集合并将其转换为 Python 中的 Pandas 数据框。我用下面的代码试了一下:

cred = credentials.Certificate(serviceAccountKeyJson)
firebase_admin.initialize_app(cred, databaseURL)
db = firestore.client()

col_ref = db.collection(collection_name)

docs = col_ref.stream()

rows_list = []
for doc in docs:
    column_name_list = list(doc.to_dict().keys())
    values_list = list(doc.to_dict().values())
    rows_list.append(values_list)

col_data_df = pd.DataFrame(rows_list, columns=column_name_list)

它可以工作,但是当我将col_data_df 保存到 csv 文件中时,内容似乎如下:

AAA BBB CCC
15  1   6
3   83  19
100 4   2

我知道集合中的每个文档在每个文档中都有相同的字段(我的意思是“字段名称”)。但是我有一个挑战,我事先不知道这些字段的名称! 我选择了在for 循环中将字段名称分配给column_name_list 的丑陋方式。 但在 for 循环的每一步中,字段的顺序似乎都不同。

例如,第一行应该是“6 1 15”,但我在 csv 文件中看到“15 1 6”。

如何在事先不知道文档字段名称的情况下读取集合数据并将其保存在 Pandas 数据框中(使用 Python)?

【问题讨论】:

    标签: python pandas firebase dataframe google-cloud-firestore


    【解决方案1】:

    下面的代码似乎解决了这个问题:

    import pandas as pd
    from google.cloud import firestore
    
    db = firestore.Client()
    users = list(db.collection(u'users').stream())
    
    users_dict = list(map(lambda x: x.to_dict(), users))
    df = pd.DataFrame(users_dict)
    

    我在这里找到了它: https://gist.github.com/romicofre/ee80100b62b5fdbed42218e8239df94e

    欢迎任何其他方法/解决方案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 2015-07-05
      相关资源
      最近更新 更多