【问题标题】:Query Firebase with multiple criteria使用多个条件查询 Firebase
【发布时间】:2017-10-26 07:58:56
【问题描述】:

我正在开发一个 iOS 应用程序。为此,我有一个包含成分和食谱的 firebase 数据库。不难想象;一个食谱有与之关联的子成分,并且一个成分可以包含在多个食谱中。下面是我的 JSON 结构示例:

    {
  "ingredients" : {
    "chicken" : {
      "meal1" : true,
      "meal2" : true
    },
    "beef" : {
      "meal2" : true
    },
    "lamb" : {
      "meal1" : true,
      "meal3" : true
    }
  },
  "meals" : {
    "meal1" : {
      "ingredients" : {
        "chicken" : true,
        "lamb" : true
      }
    },
    "meal2" : {
       "ingredients" : {
        "chicken" : true,
        "beef" : true
    },
    "meal3" : {
      "ingredients" : {
        "lamb" : true
    }
  }
}

问题:查询包含用户选择的一组成分的食谱列表并将它们添加到食谱对象数组中的最佳做法是没有 引入重复的食谱?我正在寻找包含至少 1 种成分匹配的所有食谱。

示例:用户正在从我的示例数据库中搜索包括“chicken”和“beef”的食谱,我希望返回 recipe1 和 recipe2。 Recipe2 包括鸡肉和牛肉,所以我不希望它被两次拉入搜索结果。

我的第一个想法是查询 first chicken 下的所有餐点,然后查询牛肉下的所有餐点,然后执行某种功能来删除重复项。在我看来,这不是一个好的解决方案,因为您可能会生成多个重复的餐点,理论上您必须删除这些餐点。有没有更好的办法?

【问题讨论】:

    标签: swift firebase firebase-realtime-database nosql


    【解决方案1】:

    Firebase 本身并没有为您提供使用多个查询或链的方法。这可以防止您过多地减慢您的应用程序。 (我们应该对此感到高兴)。

    现在仍然可以通过三种不同的方式获得所需的结果。

    1. frontend queries: 如果您不希望拥有大量数据,这可能是实现目标的最简单方法。不要害羞地使用它们,它们可以非常有效。

    2. data structure: 第二种方法是重组数据库。相信我,你可以通过这种方式实现所有可以想象的query chain

    3. 结合这两种方法。有时您可以构建一个结构来减少返回值的数量,然后使用前端查询来完成其余部分。

    在你的例子中,你已经有了一个非常好的结构。因此,假设用户正在搜索 lambchicken,您可以调用这些节点并在前端进行某种合并。

    但是是的,它可能会更快。最好的方法可能是镜像您的数据。您可以创建像chicken-lambchickenlamb 这样的节点,然后直接调用它们。当然,这可能会产生大量数据,但速度非常快。

    假设用户搜索chickenbeeflamb。您只需创建一个字母数字顺序即可获取节点:/beef-chicken-lamb

    按照这种方法,您可以避免任何查询。所以如果你真的很喜欢表演,这是一个很棒的方法。

    【讨论】:

    • 感谢 Orlandster,我对您关于重组的第二点很感兴趣。我看到它可能会在 firebase 中生成数千个节点和重复项,但我想这只是我习惯了 NoSQL 并优化其性能优势。
    猜你喜欢
    • 2018-05-06
    • 2011-09-18
    • 2021-11-12
    • 1970-01-01
    • 2012-12-01
    • 2018-08-04
    • 1970-01-01
    • 2016-01-15
    • 2017-08-06
    相关资源
    最近更新 更多