【问题标题】:Range filter and order by different field Firestore Swift按不同字段 Firestore Swift 进行范围过滤和排序
【发布时间】:2018-09-19 13:00:21
【问题描述】:

我需要按 createtAt 对用户进行排序,但是因为我还需要按年龄范围查询,所以第一次排序需要在同一字段上,但这破坏了整个概念。

在不同领域也使用年龄范围时,是否无法由最新用户订购,或者是否有解决方法?

    database.collection("users")
        .whereField("birthday", isGreaterThan: exploreSettings.upperAgeDate)
        .whereField("birthday", isLessThan: exploreSettings.lowerAgeDate)
        .whereField("isHidden", isEqualTo: false)
        .order(by: "birthday")
        .order(by: "createdAt", descending: true)
        .limit(to: 8)
        .start(afterDocument: lastSnapshot)
        .getDocuments {...}

【问题讨论】:

    标签: swift firebase google-cloud-firestore


    【解决方案1】:

    Firestore 查询只能对单个字段进行排序。

    对多个值进行排序的唯一方法是以有意义的方式将两个值组合到一个字段中。所以:如果你能找到一种方法来表达生日和创建时间戳之间的关系,你可以将这两个值组合在一个字段中并对其进行排序。

    请注意,这几乎不可能。我知道的最常见的例子是Geohashes,它以允许查询地理范围的方式结合了纬度和经度。

    【讨论】:

    • 不要认为这在我的情况下是可能的,因为我也必须按地理范围过滤用户,但还没有到达那部分。首先,我需要找到一种通过 createdAt 时间戳过滤年龄和顺序的方法。同样将多个值组合到一个字段中似乎很乱,真的推荐吗?
    • 可以在一个字段上过滤并在另一个字段上排序。但是您的代码正在尝试对两个字段进行排序,这是不可能的。 Firestore 查询只能对单个字段进行排序。
    • 抱歉回复晚了,一直在做其他事情,不过还是有问题。我不需要 orderBy 生日,那只是因为大多数人的第一个订单与我正在使用范围过滤器的字段在同一字段上。您确实提到了将 created at 和birthday 合并到同一个字段中,这怎么可能?
    • 我可能已经找到了一种方法来做到这一点。从 Firestore 检索数据时,默认情况下按 id 排序,因此如果我可以将文档存储到 Firestore 中,其 id 使文档按 createdAt 排序,那么我在检索数据时不需要排序。请看我的另一个问题:stackoverflow.com/questions/50010771/…
    猜你喜欢
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2022-08-14
    • 2019-02-07
    • 2012-04-09
    相关资源
    最近更新 更多