【问题标题】:Firestore Compound Query with order and limit带有顺序和限制的 Firestore 复合查询
【发布时间】:2020-01-16 17:50:00
【问题描述】:

我想查询我的 Firestore 数据库中的一个集合

我想查询以获取当前用户供稿的所有帖子。 我目前是这样做的

let ref = Firestore.firestore().collection("feedItems")
            .whereField("uid", isEqualTo: uid)
            .whereField("wasViewed", isEqualTo: false)
            .whereField("isResharedPost", isEqualTo: false)
            .whereField("story", isEqualTo: false)
            .whereField("createdAt", isGreaterThan: dateFilter as Any)
            .order(by: "createdAt", descending: false)
            .limit(to: 25)
        ref.getDocuments { (snapshot, err) in

我现在正在为故事添加选项,并希望为故事字段等于 true 的 feedItems 查询相同的集合

但是在这种情况下,我还需要确保只获取不到 24 小时的对象。所以我希望我的查询有两个稍微不同的过滤器集

        .whereField("story", isEqualTo: true)
        .whereField("postCreatedAt", isGreaterThan: storyFilter as Any)

和一个有

        .whereField("story", isEqualTo: false)
        .whereField("createdAt", isGreaterThan: dateFilter as Any)

所有其他字段保持不变,顺序和限制保持不变。

这可以组合成一个复合查询吗?

我试过这样

let ref = Firestore.firestore().collection("feedItems")
        ref
            .whereField("uid", isEqualTo: uid)
            .whereField("wasViewed", isEqualTo: false)
            .whereField("isResharedPost", isEqualTo: false)
            .whereField("story", isEqualTo: false)
            .whereField("createdAt", isGreaterThan: dateFilter as Any)
        ref 
            .whereField("uid", isEqualTo: uid)
            .whereField("wasViewed", isEqualTo: false)
            .whereField("isResharedPost", isEqualTo: false)
            .whereField("story", isEqualTo: true)
            .whereField("postCreatedAt", isGreaterThan: storyFilter as Any)
        ref.getDocuments { (snapshot, err) in

在试图弄清楚如何处理订单和限制的位置和方式之前,我收到错误无效或权限不足

如果无法合并,我会将它们分成两个单独的查询,这些查询将按顺序调用。

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore


    【解决方案1】:

    Cloud Firestore 中的单个查询只能对单个字段执行范围过滤(>=<= 等)。由于您似乎想同时过滤 createdAtpostCreatedAt,这是不可能的。

    另见:

    【讨论】:

    • 说我摆脱了 ".whereField("createdAt", isGreaterThan: dateFilter as Any)" 并且只过滤了 postCreatedAt
    • 这应该可以工作,因为您只使用一个范围过滤器。只是那个范围过滤器有问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2018-10-23
    相关资源
    最近更新 更多