如何使用 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 中的查询添加另一个过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地向对象添加键?

在 Meteor 中如何有条件地向客户端发送数据?

如何使用条件有效地向量化多项式计算(屋顶线模型)

如何使用 Flutter 执行 Firebase 可变事务数据?

Swift 3.0 如何在 Firebase 中的父级上添加子级

Swift -Firebase 如何知道 .childAdded 是不是为空?