恢复查询质询



我在使用 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))
);

这些限制并不令人惊讶,因为文档明确指出这无法完成。但这到底是怎么回事呢?似乎我正在尝试进行一个非常基本的查询,我错了吗?我该怎么做?我应该放弃这个,只做我自己的后端吗?

Cloud Firestore 尚不支持地理查询。您似乎已经知道这一点,但是我将列出一些先前有关它的问题以供参考:

  • 有没有办法将GeoFire与Firestore一起使用?
  • 如何在Firebase Cloud Firestore中查询集合中最近的GeoPoints?
  • 如何使用火堆运行地理"附近"查询?

如果您现在想要执行它们,那么您应该考虑使用支持它们的数据库(例如Firebase实时数据库通过Geofire附加组件库所做的),或者实现自己的地理查询机制(这将涉及实现地理哈希,将纬度/纬度组合放入单个字段中,然后查询该字段的范围。后者是一个非常不平凡的练习,所以只有当其他两个选项(等待或实时数据库)不适合你时,我才会推荐它。

我认为没有另一种方法可以执行具有多个范围过滤器的查询。问题是让此类查询以水平可扩展的方式工作。使用单个范围条件,Firestore 可以执行类似于我在此处描述的操作。具有不再起作用的多个范围。您基本上需要找到一种方法将要过滤的值组合成单个值,类似于地理哈希将 lat 和 lon 组合在一起的方式。

最新更新