Swift中带有过滤器的高级Firebase查询

iOS极客

我只是来自关系数据库学校,对于新手来说,处理JSON数据库并不是一件容易的事。我有这种结构来存储用户:

{
  "users" : {
    "0CcKvNkOm5fVqL" : {
      "birthday" : 564688000,
      "country" : "US",
      "email" : "[email protected]",
      "firstName" : "John",
      "gender" : "male",
      "isOnline" : true,
      "lastLoginDate" : 1468166460486,
      "lastName" : "Paul",
      "learningLanguages" : [ {
        "language" : "fr_FR",
        "levelID" : 2
      } ],
      "profileImage" : "https://firebasestorage.googleapis.com/image.jpg",
      "providerID" : "Firebase",
      "registrationDate" : 1468168460486,
      "speakingLanguages" : [ {
        "language" : "es_ES",
        "levelID" : 7
      } ]
    }
  }
}

我在我的应用程序中提供了一个搜索屏幕,用户可以在其中搜索其他用户,他们可以结合所有以下过滤器参数:

例子:

获取以下10用户starting from index 0

  • male
  • "US"
  • speaks "da_DK"levelID 2 或/和 "fr_FR"any level
  • 学习“ de_DE”with级别1并**and/or**学习“ ar_AR”with级别4`
  • age range between 18 and 24
  • ORDER BYisOnline last login date

假设存在一个名为users_languages的表,这对于SQL来说是一项简单的任务:

SELECT ...
FROM users AS u
JOIN users_languages AS l
  ON u.id = l.id
WHERE u.gender = "male" 
AND u.age BETWEEN 18 AND 24 // need claculation but let's keep it simple
AND u.country = "US"
AND ((l.language = "de_DE" AND l.mode = "learning" AND l.level = 1) OR (l.language = "ar_AR" AND l.mode = "learning" AND l.level = 4))
....
ORDER BY isOnline, lastLoginDate DESC
LIMIT 0,10

我的问题:

  1. 我如何使用实际结构使用Firebase构建上面的查询
  2. 如果无法针对特定用例改善数据库结构(以便能够以更好的方式处理上面的查询)
周杰伦

最直接的答案是:您不能在Firebase中进行搜索。

让我提出一个文本墙的答案,希望能找到解决方案。

坦率地说:正如Frank在他的即时评论和链接中提到的那样,利用诸如ElasticSearch之类的其他产品可以是一种解决方案。尽管它们确实提供了可伸缩性,但它为方程式增加了另一个乘积。我建议进一步探索这些选择。

过滤很酷:第二种解决方案是过滤代码。尽管这对于成千上万的记录是一个很好的解决方案,但它无法扩展成千上万的记录。但是,如果您具有复杂的数据结构和有限的数据量,这是最佳的解决方案。

关于这一点,如果用户界面的结构使其可以正常工作,那么即使有数百万条记录,您也可以过滤代码。确定一到两个主要搜索,例如性别。然后对所有女性进行查询。这样可以将您的数据集减少一半,并且在代码中更易于管理。您还可以进一步减少数据集-请参阅下一节。

变化是件好事:另一个选择是构造数据以匹配将要执行的查询类型。举一个简单的例子:假设您要查询三个项目;性别国家年龄

您的Firebase结构为

users
  -Jyiai09jsi
    data: "male_US_40"
  -Jqkjisjida
    date: "male_US_27"
  -JyHYjlkall
    data: "male_US_30"

然后查询美国30至40岁之间的所有男性用户

usersRef.queryOrderedByChild("data").queryStartingAtValue("male_US_30")
        .queryEndingAtValue("male_US_40").observeSingleEventOfType(
       .Value, withBlock: { snapshot in
    print(snapshot)
})

这里的好处是它具有可扩展性,但缺点是您不能仅查询美国用户。另一方面,这是一个非常小的数据集,您可以进一步在代码中进行过滤。

重复数据是您的朋友:好消息是,还有一个解决方案:磁盘空间便宜,因此重复数据

user_countries
   US
       -Jyiai09jsi: true
       -Jqkjisjida: true
       -JyHYjlkall: true
   UK
      etc etc

user_gender
   male
       -Jyiai09jsi: true
       -Jqkjisjida: true
       -JyHYjlkall: true
   female
       etc etc

user_speaks
   da_UK
      users
   fr_FR
      users

这种结构使您可以快速访问数据组。国家/地区,性别等。在这里,我使用true作为占位符,但从技术上讲,您也可以在该位置拥有每个用户节点。但是,这将再次在查询过程中读取大量数据。即使有成千上万个节点,一堆“真实”节点也只包含极少量的数据。

SQL ftw!还需要考虑的其他因素是您如何使用Firebase的异步特性。您是否真的需要将这些数据存储在Firebase中,还是可以将这些数据存储在另一个基于云的SQL Server中以进行查询并在Firebase中存储指向该数据的链接。这样,您可以通过SQL查询您的内心内容,然后使用Firebase进行消息传递,更新等。

最终思想如果要进行此类搜索,最好的选择是以一种结构化数据的方式,以尽可能快地减少其占用空间,然后在代码中过滤其余数据。想象一下,拥有一百万条记录,然后查询male_US_30_FR。现在您有几千条记录,可以轻松地加载它们并在代码中进一步过滤

我希望这些帮助中的一种或多种帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

雄辩的带有过滤器的复杂查询

来自分类Dev

带有过滤器的GetPivotData

来自分类Dev

带有过滤器的mdChips

来自分类Dev

带有过滤器的高级搜索-Angular.js

来自分类Dev

返回页面时,带有过滤器搜索页面的Flutter不断从查询中添加相同的列表视图

来自分类Dev

带有过滤器的ElasticSearch function_score查询

来自分类Dev

带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

来自分类Dev

通过ForeignKey外部引用对带有过滤器的子查询进行了汇总

来自分类Dev

PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

来自分类Dev

弹性搜索 更像这个带有过滤器的查询是添加结果

来自分类Dev

带有过滤器的Spring数据ElastiSearch聚合

来自分类Dev

带有过滤器Elasticsearch的功能评分

来自分类Dev

Python Web抓取带有过滤器的表

来自分类Dev

带有过滤器的Django rest框架API

来自分类Dev

带有过滤器的Python BeautifulSoup抓取网站

来自分类Dev

带有过滤器的Spring数据ElastiSearch聚合

来自分类Dev

带有过滤器的淘汰嵌套的foreach

来自分类Dev

带有过滤器的Django URL模板

来自分类Dev

带有过滤器的 Rsyslog 加载模块

来自分类Dev

div中带有过滤器亮度背景的文本颜色

来自分类Dev

Android中带有过滤器菜单按钮的GridView

来自分类Dev

在Cuba Platform控制器中打开带有过滤器的窗口

来自分类Dev

如何从Python列表中创建不同的数据框(带有过滤器)

来自分类Dev

Powerbi中带有过滤器的动态百分比变化

来自分类Dev

ng-grid中带有过滤器的单元格模板

来自分类Dev

在Cuba Platform控制器中打开带有过滤器的窗口

来自分类Dev

ElasticSearch 6 中带有过滤器的嵌套对象的聚合

来自分类Dev

具有过滤器的C#中的MongoDB Linq查询

来自分类Dev

当执行参数化的N1QL查询时,Couchbase不使用带有过滤器的索引

Related 相关文章

  1. 1

    雄辩的带有过滤器的复杂查询

  2. 2

    带有过滤器的GetPivotData

  3. 3

    带有过滤器的mdChips

  4. 4

    带有过滤器的高级搜索-Angular.js

  5. 5

    返回页面时,带有过滤器搜索页面的Flutter不断从查询中添加相同的列表视图

  6. 6

    带有过滤器的ElasticSearch function_score查询

  7. 7

    带有过滤器的AppEngine数据存储区查询从不返回结果(Go)

  8. 8

    通过ForeignKey外部引用对带有过滤器的子查询进行了汇总

  9. 9

    PHP Elasticsearch,带有过滤器的布尔查询未获得任何结果

  10. 10

    弹性搜索 更像这个带有过滤器的查询是添加结果

  11. 11

    带有过滤器的Spring数据ElastiSearch聚合

  12. 12

    带有过滤器Elasticsearch的功能评分

  13. 13

    Python Web抓取带有过滤器的表

  14. 14

    带有过滤器的Django rest框架API

  15. 15

    带有过滤器的Python BeautifulSoup抓取网站

  16. 16

    带有过滤器的Spring数据ElastiSearch聚合

  17. 17

    带有过滤器的淘汰嵌套的foreach

  18. 18

    带有过滤器的Django URL模板

  19. 19

    带有过滤器的 Rsyslog 加载模块

  20. 20

    div中带有过滤器亮度背景的文本颜色

  21. 21

    Android中带有过滤器菜单按钮的GridView

  22. 22

    在Cuba Platform控制器中打开带有过滤器的窗口

  23. 23

    如何从Python列表中创建不同的数据框(带有过滤器)

  24. 24

    Powerbi中带有过滤器的动态百分比变化

  25. 25

    ng-grid中带有过滤器的单元格模板

  26. 26

    在Cuba Platform控制器中打开带有过滤器的窗口

  27. 27

    ElasticSearch 6 中带有过滤器的嵌套对象的聚合

  28. 28

    具有过滤器的C#中的MongoDB Linq查询

  29. 29

    当执行参数化的N1QL查询时,Couchbase不使用带有过滤器的索引

热门标签

归档