Swift Firestore查询地理哈希过滤
Firestore查询问题。我的文档中有一个“geohash”字段,我想根据它进行筛选。 我看过Frank的@puf视频,内容是关于在yt上获取循环地理哈希。现在我还不关心循环查询。 我有一个用户的geohash。还有很多我想过滤的10精度地理哈希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更好的
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
字段的文档。代码看起来很好,因此数据中更有可能出现问题。请添加您认为应该返回的文档的屏幕截图(或JSONdata()
)。嗨,弗兰克-也许这与查询有关,是否可能只是检查字符串长度相等/较大的字符计数,而不是检查每个字符串值?不应该这样。您可以通过搜索documentRef.whereField(“category”,大于或等于“soc”)
的示例进行测试。好的,我再试试这个。谢谢更新了示例代码@FrankvanPuffelenThanks,以便于澄清!我会给它做一次测试。再次谢谢你,弗兰克,就这样。它不太准确,但对于我的使用casedocRef来说已经足够了。whereField(“geohash”,大于或等于“abcd”)。whereField(“geohash”,小于“abcd~”),它返回20k块中的所有内容。谢谢