如何使用 swift 有条件地向 Firebase Firestore 中的查询添加另一个过滤器?
Posted
技术标签:
【中文标题】如何使用 swift 有条件地向 Firebase Firestore 中的查询添加另一个过滤器?【英文标题】:How to conditionally add another filter to a query in Firebase Firestore using swift? 【发布时间】:2018-09-01 16:35:14 【问题描述】:我正在使用 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
.....
)
我预计这将只返回具有“活动:真”字段的用户的结果,但是,它返回与没有过滤器的查询相同的列表...... 如果我这样写:
let db = Firestore.firestore()
let reference = db.collection("users").limit(to: 20).whereField("active", isEqualTo: true)
reference.getDocuments(completion: (querySnapshot, error) in
.....
)
它首先返回我预期的结果。 我不知道为什么我的过滤器不起作用。 如何以用户友好的方式添加逻辑“AND”条件?
【问题讨论】:
【参考方案1】: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
。
【讨论】:
道格谢谢!我不知道 Firestore 查询对象是不可变的。您的回答不仅会帮助我,还会帮助其他不知道的人:) 谢谢!以上是关于如何使用 swift 有条件地向 Firebase Firestore 中的查询添加另一个过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Flutter 执行 Firebase 可变事务数据?