Firestore 查询 geohash 过滤

Firestore query geohash filtering

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

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

我希望此查询 return 比 userGeohash 更好的任何地理哈希。但它不会return编辑什么。

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

但我什么也没得到 returned..我的逻辑一定是瓶颈..

示例代码:

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" 作为我的过滤器,它也 return 所有文档。

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

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

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

如果要模拟 start with 类型的操作,您需要使用封闭范围查询,其中也包括范围的结束条件。

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

此 returns 所有具有 geohash 字段以 c2b2qdd 开头的文档。