【问题标题】:Querying data from Firebase using multiple filters使用多个过滤器从 Firebase 查询数据
【发布时间】:2015-04-20 16:42:44
【问题描述】:

我有一个名为 products 的 Firebase 数组,其中包含类似这样的项目:

JhMIecX5K47gt0VaoQN: {
    brand: "Esprit"
    category: "Clothes",
    gender: "Boys",
    name: "Pants",
}

是否可以通过 Firebase API 使用多个过滤器从该数组中查询产品。例如,我可能想按brandcategory 过滤(所有“裤子”都按“Esprit”)。到目前为止,我已经尝试按子键排序,然后限制此排序的开始和结束,但我不知道如何应用更多过滤器。

我正在使用 iOS SDK。

【问题讨论】:

  • Firebase 一次只能过滤一个属性(或值)。如果您在单个查询中调用多个orderBy... 方法,则应该引发错误,表明这是不允许的。它不适合你吗?
  • @FrankvanPuffelen 是的,我确实收到了一个错误,但我想知道我是否做错了。可惜不支持。
  • @FrankvanPuffelen 如果您将评论格式化为答案,我会接受它作为正确答案。
  • 完成。但我也投票决定将此问题作为重复问题结束,应该在某个时候提出。

标签: ios swift filter firebase


【解决方案1】:

Firebase 一次只能对一个属性(或值)进行排序/过滤。如果您在单个查询中多次调用 orderBy... 方法,则会引发错误,表明这是不允许的。

【讨论】:

    【解决方案2】:

    实际上,在 Firebase 中,当您按特定键排序时,还涉及另一个索引:推送 ID(如果您使用它们)它们几乎完全按时间顺序排序,因此您按字段 XXX 加时间排序。

    More details here

    在你的情况下,这不是时间,所以唯一的解决方案是使用额外的复合索引:

    JhMIecX5K47gt0VaoQN: {
        brand: "Esprit"
        category: "Clothes",
        brandcategoryIndex: "EspritClothes",
        categorybrandIndex: "ClothesEsprit",
        brandnameIndex: "EspritPants",
        namebrandIndex: "PantsEsprit",
        gender: "Boys",
        name: "Pants",
    }
    

    在上面的例子中,你可以通过:

    • 类别 > 品牌(以及其他方式)
    • 名称 > 品牌(以及其他方式)

    只需确保将这些字段添加到规则部分的 Firebase 索引中,并在项目被修改时随时维护它们。

    (这种为了提高性能而增加冗余数据成本的过程,在这种情况下由 Firebase 强制执行,称为denormalization

    【讨论】:

    • 那么,如果您涵盖了所有场景/索引,是否会查询所有这些场景/索引? IE。假设用户可以通过选择过滤掉所有这些项目,只要我涵盖了所有场景,我是否可以显示品牌、类别、性别和名称的匹配结果?这真的是不好的做法吗?我目前正在将我的解析数据库移动到 Firebase,在 Parse 中我使用了 5 个不同类别的查询。
    猜你喜欢
    • 2018-08-04
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多