Firestore查询以查找机场前缀

时间:2020-11-04 21:07:13

标签: swift google-cloud-firestore

结果应该是一个机场名称,该名称在距iPhone当前位置3英里的纬度和经度之间,只是在查询中输入了错误的机场。

代码:

    let lat = 0.0144927536231884
    let lon = 0.0181818181818182
    let lowerLat = latitude - (lat * distance)
    let lowerLon = longitude - (lon * distance)
    let greaterLat = latitude + (lat * distance)
    let greaterLon = longitude + (lon * distance)
    let docRef = Firestore.firestore().collection("airport")
        docRef.whereField("latitude", isGreaterThan: lowerLat)
        .whereField("latitude", isLessThan: greaterLat)
        docRef.whereField("longitude", isGreaterThan: lowerLon)
        .whereField("longitude", isLessThan: greaterLon)
        docRef.getDocuments { snapshot, error in
        if let error = error {
            print("Error getting documents: \(error)")
        } else {
            for document in snapshot!.documents {
                if self.btStart.currentTitle == "Decolagem" {
                    self.tfOrigin.text = (document.get("ident") as! String)
                } else {
                    self.tfDestination.text = (document.get("ident") as! String)
                }
            }
        }
    }
}

此查询正确吗?

1 个答案:

答案 0 :(得分:1)

您的代码有两点根本上是错误的。首先是它实际上并不查询您要查询的内容,它所做的只是从机场集合中获取所有文档。第二个是,您似乎正在尝试使用多个字段上的范围过滤器查询文档-范围过滤器必须全部在同一字段上查询。

docRef是对集合的引用(因此它实际上应称为colRef之类),其中不包含任何查询参数,这就是为什么查询不返回任何有意义的内容的原因,因为这不完全是一个查询,只是一个收藏夹。

docRef.whereField("latitude", isGreaterThan: lowerLat).whereField("latitude", isLessThan: greaterLat)
docRef.whereField("longitude", isGreaterThan: lowerLon).whereField("longitude", isLessThan: greaterLon)

由于您已将docRef声明为常量,并且实际上从未尝试更改其值,因此上述两行实际上没有任何作用。您正在寻找的是这样的:

let query = Firestore.firestore().collection("airport").whereField("latitude", isGreaterThan: lowerLat).whereField("latitude", isLessThan: greaterLat)

query.getDocuments { snapshot, error in
    ...
}

此代码将返回一组有意义的文档。但是,您不能在此查询的另一个字段上添加范围过滤器。当您使用范围过滤器latitude时,您已经在该查询中消耗了唯一可用的范围过滤器。