swift - Firestore 查询 geohash 过滤

标签 swift google-cloud-firestore geohashing

Firestore 查询问题。我的文档中有一个“geohash”字段,我想作为过滤依据。 我看过 Frank 的@puf 视频,内容是关于在 yt 上获取圆形 geohashes。现在我还不关心循环查询。 我有一个用户的 geohash。还有很多我想过滤的 10 个精确的 geohashes。

let userGeohash = "c2b2qd"
documentRef.whereField("geohash", isGreaterThanOrEqualTo: userGeohash)

我希望此查询返回比 userGeohash 更好的任何 geohashed。但它不会返回什么。

input = "c2b2qd"
expected output:
"c2b2qdh7rs"
"c2b2qdh2ht"
"c2b2qd3etr"

但我没有得到任何返回..我的逻辑一定是瓶颈.. enter image description here

示例代码:

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd").getDocuments { (query, error) in
            query?.documents.forEach({ (snapshot) in
                let data = snapshot.data()
                print(data["geohash"] as! String)
            })
        }


// returns the following :
c2b2qddkc3q
c2b2qddkdcm
c2b2qddpydb
c2b2qehqtkg
c2b2qey3dje
c2b2qey4e62
c2b2qey4em1
c2b2qkp7cm0
u1hg7pzxs26


// expected output: 
c2b2qddkc3q
c2b2qddkdcm
c2b2qddpydb

我什至尝试使用“aaaaaaaa”作为我的过滤器,它也返回所有文档。

最佳答案

您似乎误解了 Firebase 查询。您的查询返回一个开放式范围:

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd")

具体来说,这个查询打开geohash上的索引,它是按字典顺序排列的,它找到第一个以c2b2qdd(或更大)开头的条目,然后返回所有从那时起的结果。所以这包括像 c2b2qehqtkg 这样的结果,因为它们大于或等于

如果你想模拟一个开始于类型的操作,你需要使用一个封闭的范围查询,它也包括范围的结束条件。

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd")
      .whereField("geohash", isLessThan: "c2b2qde")

这将返回所有具有以 c2b2qdd 开头的 geohash 字段的文档。

关于swift - Firestore 查询 geohash 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283958/

相关文章:

android - Firestore 日志记录如何工作?

android - 删除元素时 Firestore 快照监听器触发

geohashing - geohash 字符串长度和精度

ios - DateFormatter 不返回 "HH:mm:ss"的日期

ios - Storyboard如何推送嵌套导航 Controller ?

javascript - Firebase Firestore - 复合查询中包含多个数组

java - Scala:从 WKT 线串获取 geohashes 的库

ios - 如何以编程方式更改 UIButton 属性文本颜色?

swift - Tableview 禁用单元格中的用户交互