Python Firestore查询仅获取一个字段的值花费的时间太长

Python Firestore查询仅获取一个字段的值花费的时间太长,python,firebase,google-cloud-firestore,Python,Firebase,Google Cloud Firestore,。嗨,社区 我对Firebase的firestore查询有一个问题 我收集了大约18000份文件。我想获得其中一些文档的单个相同字段的值。我使用google cloud python客户端的pythonfirestore_v1库。因此,例如,列表_edges.length=250: [db_firestore.document(f"edges/{edge['id']}").get({"distance"}).to_dict()["distance"] for edge in list_edges

。嗨,社区

我对Firebase的firestore查询有一个问题

我收集了大约18000份文件。我想获得其中一些文档的单个相同字段的值。我使用google cloud python客户端的pythonfirestore_v1库。因此,例如,列表_edges.length=250:

[db_firestore.document(f"edges/{edge['id']}").get({"distance"}).to_dict()["distance"] for edge in list_edges] 
评估大约需要30秒以上的时间,同时使用MongoDB上的equal collection,执行此操作并加载整个对象(而不仅仅是一个字段)所需的时间不超过3秒:

list(db_mongo["edges"].find({"city_id":{"$eq":city_id},"id": {"$in": [edge_id for edge in list_edges]}}))
…话虽如此,我认为解决方案可能是按城市id将大型集合分开,因此我创建了一个新集合并将对应的文档复制到其中,因此现在查询如下所示:

[db_firestore.document(f"edges/7/edges/{edge['id']}").get({"distance"}).to_dict()["distance"] for edge in list_edges] 
其中7是城市标识

然而,这需要同样的时间。因此,问题可能出在.get()方法上,但我找不到任何适合我的情况的优化解决方案

你能帮我做这个吗?谢谢


已编辑

我从firestore支持部门得到了答案。问题是,我分别为每个文档发出250个请求,执行.get()。其思想是只在一个请求中获得我想要的所有数据,因此我需要修改查询

假设我有下一个DB:

具有多个边缘id文档的边缘集合。对于每个新请求,我使用一个新生成的需要捕捉的边列表

在MongoDB中,我可以使用$In操作符(在文档中有edge\u id),但在firestore中,可以使用“In”操作符

所以,我需要找到另一种方法来做到这一点


有什么想法吗?谢谢

Firebase最近增加了对操作中有限的
的支持。见:

  • 这个
  • 有关的文档
从后者:

但有几点需要注意:

  • in
    子句中最多可以有10个值,在查询中只能有on
    in
    (或
    数组包含任何
    )子句
  • 我不确定您是否可以使用此运算符按ID进行选择

好消息是,它所花费的时间似乎完全取决于
list_edges.length=250
,而不是集合的大小,这符合Firestore的主要性能保证:操作所花费的时间取决于结果集的大小,而不是查询的集合的大小。不幸的是,我不知道您看到的性能是否是Firestore Python SDK所期望的,也不知道如果不是的话会是什么原因(因此只留下评论,没有回答)。@FrankvanPuffelen感谢您的评论。我已经更新了这个问题,现在更像是查询构造函数问题,而不是库性能问题。也许你对此有一些想法?谢谢在我的例子中,我有一个超过10个值的数组。按ID选择不是问题,因为我可以将其作为一个文档字段重复。这意味着您需要为每批10个ID执行此操作。如果请求的数量是瓶颈,这可能会使速度提高10倍。
cities_ref = db.collection(u'cities')

query = cities_ref.where(u'country', u'in', [u'USA', u'Japan'])