Firestore查询地理哈希过滤

时间:2019-05-23 23:08:27

标签: swift google-cloud-firestore geohashing

Firestore查询问题。我的文档中有一个“ geohash”字段,我想以此为依据。 我看过弗兰克(Frank)的@puf视频,该视频关于在yt上获取圆形地埋。现在,我不在乎循环查询。 我有一个用户的geohash。还有很多我想过滤的10种精确的Geohash。

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

我希望该查询返回比userGeohash更好的任何地理哈希值。但是它不会返回什么。

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”作为我的过滤器,该过滤器还返回所有文档。

1 个答案:

答案 0 :(得分:1)

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

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

具体地说,此查询打开geohash上的索引,该索引按字典顺序排序,它找到以c2b2qdd(或更大)开头的第一个条目,然后返回该点以后的所有结果。因此,该结果包括c2b2qehqtkg之类的结果,因为它们大于或等于

如果要模拟开头的操作,则需要使用封闭范围查询,该查询也包含范围的结束条件。

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

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