Firestore查询选项很快

时间:2018-05-01 07:00:49

标签: swift filter google-cloud-firestore

我遇到与查询Firestore相关的问题。目前,我有如下的Firestore结构。

enter image description here

我想创建一个搜索系统,用户可以选择过滤程序,状态和类别。以下是过滤器的源代码:

var filterProg = ""
var filterStat = ""
var filterCat = ""

   @IBAction func filterButtonDidTapped(_ sender: Any) {
    self.agencyList.removeAll()

  db.collection("fund")


 .whereField("programme", isEqualTo: filterProg )


 .whereField("status", isEqualTo: filterStat )


 .whereField("category", isEqualTo: filterCat )

        .getDocuments()
            {
                (querySnapshot, err) in

                if let err = err
                {
                    print("Error getting documents: \(err)");
                }
                else
                {
                    //  var agencyNumber = 0
                    for document in querySnapshot!.documents {
                        let data = document.data()
                        let agencyy = data["age"] as? String ?? ""
                        let title = data["name"] as? String ?? ""
                        let agencyId = document.documentID
                        print(title)
                        print(agencyy)
                        print(agencyId)

                        let newModel = DisplayModel(agency: title, agencyId: agencyId)
                        self.agencyList.append(newModel)
                       // self.originalData.append(title)
                    }
                    self.tableView.reloadData()
                }
    }

}

从上面的代码变量filterProgfilterStatfilterCat将从空字符串""更改为UIPicker中的某些字符串,具体取决于用户选择。问题是,如果用户决定仅过滤filterProg(程序)和filterStat(状态),则变量fileterCat将保持为空字符串""。这导致firestore中的数据不显示任何内容。我尝试过类似的方法:检查变量是否为空字符串,如下所示:

let query = db.collection("fund")

if filterProg != "" {
 query.whereField("programme", isEqualTo: filterProg )
}

if filterProg != "" {
 query.whereField("status", isEqualTo: filterStat )
}
 if filterProg != "" {
 query.whereField("category", isEqualTo: filterCat )
}
    .getDocuments() //got error here
        {
            (querySnapshot, err) in

我在.getDocuments()

上收到错误消息
  

如果没有a,则无法解析对成员'getDocuments'的引用   上下文类型

我被这个问题困住了一个星期。实际上,是否可以在Firestore上创建过滤器选项?

2 个答案:

答案 0 :(得分:2)

我目前不相信这是可能的,但解决方法可能是根据测试字段中有效字符串的结果来创建查询。

var query: Query!

if /* some condition */ {

    query = db.collection("fund").whereField("programme", isEqualTo: filterProg)

} else if /* condition */ {

    query = db.collection("fund").whereField("status", isEqualTo: filterStat)

} // etc

query.getDocuments { (snapshot, error) in
            //
        }

火炬查询的改进是关注的: https://github.com/firebase/firebase-js-sdk/issues/321

答案 1 :(得分:0)

您需要先构建查询的基础:

let query = db.collection("fund")

然后根据用户输入的值为查询添加条件:

if filterProg != "" {
 query = query.whereField("programme", isEqualTo: filterProg )
}
if filterProg != "" {
 query = query.whereField("status", isEqualTo: filterStat )
}
if filterProg != "" {
 query = query.whereField("category", isEqualTo: filterCat )
}

然后最终获得与查询匹配的文档:

query.getDocuments() {
  (querySnapshot, err) in ...