Swift Firestore查询地理哈希过滤

Swift Firestore查询地理哈希过滤,swift,google-cloud-firestore,geohashing,Swift,Google Cloud Firestore,Geohashing,Firestore查询问题。我的文档中有一个“geohash”字段,我想根据它进行筛选。 我看过Frank的@puf视频,内容是关于在yt上获取循环地理哈希。现在我还不关心循环查询。 我有一个用户的geohash。还有很多我想过滤的10精度地理哈希 let userGeohash = "c2b2qd" documentRef.whereField("geohash", isGreaterThanOrEqualTo: userGeohash) 我希望这个查询返回任何比userGeohash更好的

Firestore查询问题。我的文档中有一个“geohash”字段,我想根据它进行筛选。 我看过Frank的@puf视频,内容是关于在yt上获取循环地理哈希。现在我还不关心循环查询。 我有一个用户的geohash。还有很多我想过滤的10精度地理哈希

let userGeohash = "c2b2qd"
documentRef.whereField("geohash", isGreaterThanOrEqualTo: userGeohash)
我希望这个查询返回任何比userGeohash更好的geohash。但这不会影响被归还的东西

input = "c2b2qd"
expected output:
"c2b2qdh7rs"
"c2b2qdh2ht"
"c2b2qd3etr"
但是我没有得到任何回报我的逻辑一定是瓶颈。。

示例代码:

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

我甚至尝试使用“aaaaaa”作为我的过滤器,它也会返回所有文档

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

docRef.whereField("geohash", isGreaterThanOrEqualTo: "c2b2qdd")
具体来说,此查询打开
geohash
上的索引,该索引按字典顺序排列,它查找以
c2b2qdd
(或更大)开头的第一个条目,然后返回从该点开始的所有结果。因此,这包括像
c2b2qehqtkg
这样的结果,因为它们大于或等于

如果要模拟“以类型开始”操作,则需要使用封闭范围查询,该查询还包括范围的结束条件

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

这将返回所有具有以
c2b2qdd
开头的
geohash
字段的文档。代码看起来很好,因此数据中更有可能出现问题。请添加您认为应该返回的文档的屏幕截图(或JSON
data()
)。嗨,弗兰克-也许这与查询有关,是否可能只是检查字符串长度相等/较大的字符计数,而不是检查每个字符串值?不应该这样。您可以通过搜索
documentRef.whereField(“category”,大于或等于“soc”)
的示例进行测试。好的,我再试试这个。谢谢更新了示例代码@FrankvanPuffelenThanks,以便于澄清!我会给它做一次测试。再次谢谢你,弗兰克,就这样。它不太准确,但对于我的使用casedocRef来说已经足够了。whereField(“geohash”,大于或等于“abcd”)。whereField(“geohash”,小于“abcd~”),它返回20k块中的所有内容。谢谢