【问题标题】:How to query "nearby" & "latest" in firestore with limit in Android?如何在 Android 中使用限制查询 Firestore 中的“附近”和“最新”?
【发布时间】:2021-04-20 15:12:03
【问题描述】:

我有一个 Android 项目,我需要查询附近的项目并且这些项目应该按时间排序。

基本上,我需要 100 公里以内的文档。按时间(字段)排序。

所以我已经检查了 Firestore 文档,我得到了 solution(将 geoHash 添加到文档,然后通过 geoHasBounds 查询它们)但是有一个问题,如果 100 公里内有 1k 个文档,那么它将加载所有不是很好,那么我怎样才能限制这些不同的查询并只获得 25-30 个文档,然后再获得 25-30 个文档??

简而言之,这就是我需要的-

如何查询100KM半径内最新的25个文档以及用户向下滚动接下来的25个文档的时间?

这是我的查询代码-

List<GeoQueryBounds> bounds = GeoFireUtils.getGeoHashQueryBounds(center, radiusInM);
    final List<Task<QuerySnapshot>> tasks = new ArrayList<>();
    for (GeoQueryBounds b : bounds) {
         Query newQuery = itemQuery.orderBy("geoHash").startAt(b.startHash).endAt(b.endHash);

        tasks.add(newQuery.get());
    }

    // Collect all the query results together into a single list
    Tasks.whenAllComplete(tasks).........

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    您要查找的内容称为pagination。我已经在 Stackoverflow 上回答了question,在这里我解释了一种推荐的方法,您可以通过将查询游标与“limit() 方法”结合起来对查询进行分页。我还建议您看看这个 video 以获得更好的理解。

    如果您愿意尝试Paging 3 library,请参阅下面的文章,它将帮助您实现这一目标。

    编辑:

    Tasks.whenAllComplete() 方法:

    当所有指定的任务都完成时,返回一个任务列表,其中包含成功完成的任务列表。

    因此,您可以简单地将每个对象转换为您需要的对象类型并相应地对该列表进行分页。不幸的是,这意味着首先要获取所有对象。否则,您可以通过使用单独的分页将这些查询分成单独的查询并相应地处理它们。

    【讨论】:

    • 对不起,我已经知道了,但问题是地理查询并不简单。基本上,如果您单击相关解决方案的链接,您会看到有多个半径查询。
    • 您可以按照我在回答中解释的方式对这些查询进行分页。关键是传递给 startAfter() 方法,传递给下一个查询,最后一个可见的 DocumentSnapshot。
    • 是的,我可以限制,但问题是我不知道每个查询将返回多少个文档,我需要为所有这些查询(一起)限制 25 个文档。假设我得到 5 个 geoHashBounds,那么如果我将每个限制为 5-5,然后假设 4 个边界只有 1-1 个文档,而第 5 个边界有 20 个文档,那么我将只得到 9 个文档(1+1+1+1+5 ) 因为没有查询会返回超过 5 个文档
    • 是的,没错。您无法提前知道您的查询可能返回多少个结果。但这并不重要。您可以请求特定大小的数据页。因此,在这种情况下,您应该创建一个查询来获取半径为 100KM 的位置,然后根据时间戳对结果进行排序,以获取最新的元素。别忘了创建一个index
    • 我认为没有办法在单个查询中获取所有文档,您必须查询所有 geoHash 边界的文档。我不知道为什么我无法理解你能提供代码吗?我会非常感谢你
    猜你喜欢
    • 2018-09-06
    • 2018-03-19
    • 2021-01-05
    • 2018-03-18
    相关资源
    最近更新 更多