我遇到与查询Firestore相关的问题。目前,我有如下的Firestore结构。
我想创建一个搜索系统,用户可以选择过滤程序,状态和类别。以下是过滤器的源代码:
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()
}
}
}
从上面的代码变量filterProg
,filterStat
和filterCat
将从空字符串""
更改为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上创建过滤器选项?
答案 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 ...