使Firebase返回排序的响应

时间:2019-01-21 14:29:57

标签: javascript firebase firebase-realtime-database

我在Firebase上有一个数据库。我正在努力做到这一点,以便当用户键入一个值时,他们会得到10个最接近的建议。到目前为止,这是我的查询:

<textarea className='addFriendTextArea' onChange={handleChange} placeholder='Dodaj znajomego'/>

handleChange = async (e) => {
    const {value} = e.target;
    firebase
        .database()
        .ref('Users')
        .orderByChild('nickname')
        .startAt(value)
        .limitToFirst(10)
        .once('value')
        .then(r => arrayFromObject(r.val()))
        .catch(e => console.log(e));
};

这几乎可行。问题是,如果我输入铁,例如,我会得到:

enter image description here

如果我输入例如brunonbane3,这就是我得到的:

enter image description here

因此未对它们进行排序。我知道我可以使用前端JavaScript对其进行排序,但是有没有办法使用Firebase对其进行排序?

也不应该输入确切的昵称,例如铁,只返回一条记录吗?没有“ iron2”类型的帐户。这是怎么回事?

1 个答案:

答案 0 :(得分:1)

对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。它本质上包含三部分信息:每个匹配的子代的键,每个匹配的子代的值以及匹配的子节点的顺序。

调用r.val()时,您会将上面的内容转换为单个JSON对象,该对象仅具有键和值的位置。此时,您将失去结果之间的顺序。要保持顺序,请确保使用内置的DataSnapshot.forEach()方法遍历结果:

.then(snapshot => {
  var result = [];
  snapshot.forEach(child => {
    result.push(child.val());
  })
  return result;
})