Firestore查询挑战

时间:2018-01-03 17:03:01

标签: typescript firebase-realtime-database angularfire2 google-cloud-firestore

我正在使用Firestore,但我现在开始认为使用此产品可能不切实际,因为我在尝试查询数据时面临很多挑战。

最终,我试图通过提供一些过滤标准(价格范围,日期范围,地理范围)从Firestore文档中检索地理位置列表。不幸的是,Firestore还不支持多范围查询,也不支持地理查询。以下是我到目前为止尝试过的一些事情。我正在使用AngularFire2进行此实现:

此作品

@Effect() loadPostings: Observable<Action> = this.actions
    .ofType<LoadPostings>(MapActionTypes.Load_Postings)
    .switchMap(
      latLngBound => this.firestoreDB.collection<Posting>('postings', ref => ref
        .where('duration.min', '>=', 1) // --------> this works
      ).valueChanges()
        .map(postings => new LoadPostingsSuccess(postings))
    );

这也适用

@Effect() loadPostings: Observable<Action> = this.actions
    .ofType<LoadPostings>(MapActionTypes.Load_Postings)
    .switchMap(
      latLngBound => this.firestoreDB.collection<Posting>('postings', ref => ref
        .where('duration.max', '<=', 5) // ------> this works as well
      ).valueChanges()
        .map(postings => new LoadPostingsSuccess(postings))
    );

这不起作用(出于某种原因)

@Effect() loadPostings: Observable<Action> = this.actions
    .ofType<LoadPostings>(MapActionTypes.Load_Postings)
    .switchMap(
      latLngBound => this.firestoreDB.collection<Posting>('postings', ref => ref
        .where('duration.min', '>=', 1) // ---> 2 range queries dont work :(
        .where('duration.max', '<=', 5)
      ).valueChanges()
        .map(postings => new LoadPostingsSuccess(postings))
    );

这些限制并不令人感到意外,因为文档明确表示无法做到这一点。但这甚至提供的是什么?看起来我正在尝试做一个非常基本的查询,我错了吗?我该怎么做?我应该放弃这个而只是制作自己的后端吗?

1 个答案:

答案 0 :(得分:1)

Cloud Firestore不支持 地理查询。您似乎已经知道了,但我会列出以前的一些问题以供参考:

如果您希望今天使用它们,那么您应该考虑使用支持它们的数据库(例如Firebase实时数据库通过Geofire add-on library执行),或者实现您自己的地理查询机制(这将涉及实现geohashing,将lat / lon组合放入单个字段,然后查询该字段的范围。后者是一个非常重要的练习,所以我建议只有其他两个选项(等待或实时数据库)不适合你。

我认为还有另一种方法可以执行具有多个范围过滤器的查询。问题是让这些查询以水平可扩展的方式工作。使用单一范围条件,Firestore可以执行与我所描述的here类似的操作。多个范围不再适用。您基本上需要找到一种方法将要过滤的值组合成单个值,类似于geohash组合lat和lon的方式。