使用firebase实时数据库创建搜索功能

Jer*_*rry 3 firebase angularfire firebase-realtime-database

我想使用 firebase 实时数据库为我的应用程序创建一个搜索功能,类似于 facebook 搜索。

我做了一些研究并承认 Firebase 实时无法使用“文本包含”进行搜索。但我相信必须有某种方法来实现它,例如组合 startAt 或 endAt。

我需要一些关于最佳实践的建议。

数据库结构将如下所示:

Restaurant
-->RandomID
---->name: 'Good Restaurant'
---->address:
---->desc:
-->RandomID
---->name: 'Dixon Lee Restaurant'
---->address:
---->desc:
-->RandomID
---->name: 'MCD'
---->address:
---->desc:
Run Code Online (Sandbox Code Playgroud)

编辑 我不确定 startAt 和 endAt 如何工作。如果我使用 startAt(3) 是否应该返回 3 及以上?如果我将 startAt 与字符串一起使用会怎样?就像我遇到的下面的问题:

firebase.database().ref('/restaurants').orderByChild('name').startAt('Good').on('value',snap=>{
      console.log(snap.val())
    })
Run Code Online (Sandbox Code Playgroud)

上述查询将返回: 在此输入图像描述

我正在考虑使用 startAt/endAt 实现“文本包含”,它将找到以关键字开头/结尾的字段的特定值。不确定这是否是 startAt/endAt 的用法。

Fra*_*len 6

您似乎对接受以特定值startAt开头的字符串的函数感到困惑。Firebase 过滤根本不是这样工作的。

当你这样做时ref('/restaurants').orderByChild('name').startAt('Good'),它会做三件事:

  1. restaurants根据其值对所有子节点进行排序name
  2. 找到第一个以Good(或按字典顺序排列在Good)之后的任何内容
  3. 从那时起返回每个孩子

Good Restaurant因此,您将获得名称为和的子节点MCD

您可以使用startAtendAt返回一系列节点,即以 开头的所有子节点 Good。为此,您创建一个从 开始Good并结束于 的范围Good\uF8FF

ref('/restaurants').orderByChild('name').startAt('Good').endAt('Good\uF7FF')
Run Code Online (Sandbox Code Playgroud)

由于\uF8FF是最后一个已知的 Unicode 字符,因此此查询返回以例如 , , 开头的项目GoodGoodieGoodness不是Gooey(因为Gooe是 after Good\uF7FF)。