Firestore中的复合查询

时间:2018-04-22 14:00:00

标签: swift firebase google-cloud-firestore

Firestore documentation说:

  

带有!=子句的查询。在这种情况下,您应该将查询拆分为大于查询和小于查询。例如,虽然不支持查询子句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个字段,我不能在两者中写年龄。请帮助。

1 个答案:

答案 0 :(得分:2)

当文档说你可以“组合两个查询”时,这意味着你应该制作两个完全不同的查询,分别执行它们,并在客户端上组合结果以得出最终的文档集。

您要做的是使用两个过滤年龄的子句进行单个查询。这不起作用,因为单个查询中的所有条件都是逻辑AND(在Firestore中当前没有逻辑OR查询)。以这种方式思考 - “年龄> 30岁且年龄<30”的文档集总是会产生0个文档,因为任何年龄值都不能满足这两个要求。