首页 文章

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

提问于
浏览
0

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

我做了一些研究,并承认firebase实时无法搜索“文本包含” . 但我相信必须有一些方法来实现它,比如结合startAt或endAt .

我需要一些建议最好的做法来做到这一点 .

DB结构如下所示:

Restaurant
-->RandomID
---->name: 'Good Restaurant'
---->address:
---->desc:
-->RandomID
---->name: 'Dixon Lee Restaurant'
---->address:
---->desc:
-->RandomID
---->name: 'MCD'
---->address:
---->desc:

Edited 我不确定startAt和endAt是如何工作的 . 如果我使用startAt(3),它是否假设返回3及以上?如果我在字符串中使用startAt怎么办?像下面的问题我ecnounter:

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

以上查询将返回:
enter image description here

我想用startAt / endAt实现“text contains”,它将找到以关键字开头/结尾的字段的特定值 . 不确定这是startAt / endAt的用法 .

1 回答

  • 1

    您似乎将 startAt 与一个函数混淆,该函数将接受启动 with 某个值的字符串 . 这根本不是Firebase过滤的工作方式 .

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

    • name 值上对 restaurants 的所有子节点进行排序 .

    • 找到以 Good 开头的第一个(或者在 Good 后按字典顺序排列的任何内容)

    • 从那里返回每个孩子

    所以你得到名为 Good RestaurantMCD 的子节点 .

    您可以使用 startAtendAt 返回 range 个子节点,即所有以 Good 开头的子节点 . 为此,您需要创建一个从 Good 开始到 Good\uF8FF 结束的范围:

    ref('/restaurants').orderByChild('name').startAt('Good').endAt('Good\uF7FF')
    

    由于 \uF8FF 是最后一个已知的Unicode字符,因此该查询返回以例如 GoodGoodieGoodness ,但不是 Gooey (因为 GooeGood\uF7FF 之后) .

相关问题