我正在使用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
.....
})
它返回我首先期望的结果。 我不知道为什么我的过滤器不起作用。 如何以用户友好的方式添加逻辑“与”条件?
答案 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
。