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

时间:2019-11-27 00:40:28

标签: python firebase google-cloud-firestore

。嗨,社区。

我对Firebase的 firestore 查询有疑问/问题。

我收集了大约18000个文档。我想获取其中一些文档的单个相同字段的值。我使用了来自google-cloud-python客户端的 python firestore_v1库。因此,例如list_edges.length = 250:

[db_firestore.document(f"edges/{edge['id']}").get({"distance"}).to_dict()["distance"] for edge in list_edges] 

评估大约需要30秒钟以上的时间,与此同时,在MongoDB上进行相等收集时,这样做并加载整个对象(不只是一个字段)就不会超过3秒:

list(db_mongo["edges"].find({"city_id":{"$eq":city_id},"id": {"$in": [edge_id for edge in list_edges]}}))

...话虽如此,我认为解决方案可以用city_id分隔大型集合,所以我创建了一个新集合并在其中复制了对应的文档,所以现在查询如下:

[db_firestore.document(f"edges/7/edges/{edge['id']}").get({"distance"}).to_dict()["distance"] for edge in list_edges] 

其中7是city_id。

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

您能帮我吗?谢谢!


已编辑

我已经得到了Firestore支持的答案。问题是我分别对每个文档发出了250个.get()请求。这个想法是仅在一个请求中获得我想要的所有数据,因此我需要修改查询。

假设我有下一个数据库:

edges包含多个edge_id文档。对于每个新请求,我都会使用一个新生成的需要捕获的边列表。

在MongoDB中,我可以使用 $ in 运算符(在文档内部具有edge_id)来执行此操作,但是在firestore中,可以使用“ in”运算符only accepts up to 10 equality

因此,我需要找到另一种方法来执行此操作。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

Firebase最近添加了对有限in操作的支持。参见:

来自后者:

cities_ref = db.collection(u'cities')

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

一些警告:

  • in子句中最多可以有10个值,而查询中的in(或array-contains-any)子句中只能有10个值。
  • 我不确定是否可以使用此运算符通过ID进行选择。