我想使用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())
})
以上查询将返回:
我想用startAt / endAt实现“text contains”,它将找到以关键字开头/结尾的字段的特定值 . 不确定这是startAt / endAt的用法 .
1 回答
您似乎将
startAt
与一个函数混淆,该函数将接受启动 with 某个值的字符串 . 这根本不是Firebase过滤的工作方式 .当你做
ref('/restaurants').orderByChild('name').startAt('Good')
时,它做了三件事:在
name
值上对restaurants
的所有子节点进行排序 .找到以
Good
开头的第一个(或者在Good
后按字典顺序排列的任何内容)从那里返回每个孩子
所以你得到名为
Good Restaurant
和MCD
的子节点 .您可以使用
startAt
和endAt
返回 range 个子节点,即所有以Good
开头的子节点 . 为此,您需要创建一个从Good
开始到Good\uF8FF
结束的范围:由于
\uF8FF
是最后一个已知的Unicode字符,因此该查询返回以例如Good
,Goodie
,Goodness
,但不是Gooey
(因为Gooe
在Good\uF7FF
之后) .