如何使用swift有条件地向Firebase Firestore中的查询添加另一个过滤器?

时间:2018-09-01 16:35:15

标签: swift firebase google-cloud-firestore

我正在使用Google Firebase Firestore开发一个项目。 我想在搜索用户时实施过滤器。想象一下,通过选中用户可以选择的复选框来仅搜索活动用户。

let db = Firestore.firestore()
let reference = db.collection("users").limit(to: 20)
//FILTER
if showOnlyActiveUsersBtn.isSelected {
    reference.whereField("active", isEqualTo: true)
}
reference.getDocuments(completion: {(querySnapshot, error) in
    .....
})

我希望这将仅对具有“ active:true”字段的用户返回结果,但是,它返回与查询相同的列表,但没有过滤器... 如果我这样写:

let db = Firestore.firestore()
let reference = db.collection("users").limit(to: 20).whereField("active", isEqualTo: true)
reference.getDocuments(completion: {(querySnapshot, error) in
    .....
})

它返回我首先期望的结果。 我不知道为什么我的过滤器不起作用。 如何以用户友好的方式添加逻辑“与”条件?

1 个答案:

答案 0 :(得分:2)

Firestore查询对象是不可变的,这意味着它们在创建后便无法修改。在您的代码中,您不会记住用whereField构建的新查询。相反,您需要在现有查询之上构建一个新的Query对象,并记住新的对象:

let db = Firestore.firestore()
var reference = db.collection("users").limit(to: 20)
if showOnlyActiveUsersBtn.isSelected {
    // build a new query using the old query, reassign to reference
    reference = reference.whereField("active", isEqualTo: true)
}
reference.getDocuments(completion: {(querySnapshot, error) in
    .....
})

如果您不喜欢使用var而不是let,那么我相信您可以找到一种方法来重做该示例。无论如何,您都需要记住whereField返回的新查询,并使用它来调用getDocuments