【问题标题】:Firestore query challengesFirestore 查询挑战
【发布时间】:2018-06-13 09:27:27
【问题描述】:

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

这些限制并不令人意外,因为文档明确指出无法做到这一点。但这怎么能提供呢?好像我正在尝试做一个非常基本的查询,我错了吗?我该怎么做?我应该放弃这个而只做我自己的后端吗?

【问题讨论】:

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


    【解决方案1】:

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

    如果您现在打算执行这些操作,那么您应该考虑使用支持它们的数据库(例如通过 Geofire add-on library 实现的 Firebase 实时数据库),或者实施您自己的地理查询机制(这将涉及实施地理散列,将纬度/经度组合放入单个字段,然后查询该字段的范围。后者是一个非常重要的练习,所以我只在其他两个选项(等待或实时)时推荐它数据库)不是你的选择。

    我认为没有其他方法可以进行具有多个范围过滤器的查询。问题是让此类查询以水平可扩展的方式工作。在单一范围条件下,Firestore 可以做类似于我描述的 here 的事情。具有多个不再起作用的范围。您基本上需要找到一种方法将要过滤的值组合成一个值,类似于 geohash 组合 lat 和 lon 的方式。

    【讨论】:

    • 感谢弗兰克的回复。我的其他过滤标准(价格范围、日期范围)呢?有没有办法在 Firestore 中做到这一点?
    • 我不知道。问题是让此类查询以水平可扩展的方式工作。在单一范围条件下,Firestore 可以做类似于我描述的 here 的事情。具有多个不再起作用的范围。您基本上需要找到一种方法将要过滤的值组合成一个值,类似于 geohash 组合 lat 和 lon 的方式。