带有
!=
子句的查询。在这种情况下,您应该将查询拆分为大于查询和小于查询。例如,虽然不支持查询子句where("age", "!=", "30")
,但您可以通过组合两个查询来获得相同的结果集,一个查询使用子句where("age", "<", "30")
,另一个查询子句where("age", ">", 30)
。
我需要抓住处于特定年龄范围内的用户,因此这似乎是抓住相关用户的好方法,但不幸的是,我显然不明白如何使用它。
let potentialMatchesRef = db.collection("users")
.whereField("isBanned", isEqualTo: false)
.whereField("isHidden", isEqualTo: false)
.whereField("location.country", isEqualTo: user.location.country)
potentialMatchesRef
.whereField("age", isGreaterThanOrEqualTo: user.preferences.ageRange.from)
.whereField("age", isLessThanOrEqualTo: user.preferences.ageRange.to)
这不起作用,当我使用where("age", ">", 30)
时,我收到错误Value of type 'Query' has no member 'where'
。
更新:显然他们没有专门的Swift文档。
如果我使用这个
let potentialMatchesRef = db.collection("users")
.whereField("isBanned", isEqualTo: false)
.whereField("isHidden", isEqualTo: false)
.whereField("location.country", isEqualTo: user.location.country)
.whereField("age", isLessThanOrEqualTo: to)
.whereField("age", isGreaterThanOrEqualTo: from)
我收到错误Error getting documents: Error Domain=FIRFirestoreErrorDomain Code=9 "The query requires an index.
至少有2个字段,我不能在两者中写年龄。请帮助。
答案 0 :(得分:2)
当文档说你可以“组合两个查询”时,这意味着你应该制作两个完全不同的查询,分别执行它们,并在客户端上组合结果以得出最终的文档集。
您要做的是使用两个过滤年龄的子句进行单个查询。这不起作用,因为单个查询中的所有条件都是逻辑AND(在Firestore中当前没有逻辑OR查询)。以这种方式思考 - “年龄> 30岁且年龄<30”的文档集总是会产生0个文档,因为任何年龄值都不能满足这两个要求。