为了账号安全,请及时绑定邮箱和手机立即绑定

Firebase 的实时数据库的“startAt”未按预期工作

Firebase 的实时数据库的“startAt”未按预期工作

慕尼黑8549860 2023-05-11 10:25:37
var database = firebase.database(); //db is empty.function handler(e, prevChildKey) {    console.log(e.val());}database.ref('user').orderByChild('color').startAt('a').on('value', handler);database.ref('user').set({    'ryan': {color: "a"},    'john': {color: "b"},    'kirsty': {color: "c"},});我希望:{ryan: {color: "a"}}被记录到控制台。原因是因为我认为startAt匹配值以开头的键"a"。相反,它记录:{ john: {color: "b"}, kirsty: {color: "c"}, ryan: {color: "a"}}
查看完整描述

1 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

Firebase 中的查询包含两个步骤:

  1. 您指定要排序的每个子节点的值,在您的情况下是 的值color。Firebase 读取节点,并按该值对它们进行排序。

  2. 然后指定从哪里开始返回结果,即 child a。由于您没有指定结束条件,因此 Firebase 会从它开始的那个节点返回所有子节点。

如果你想实现一个starts with操作,你需要结合startAt()使用endAt()

database.ref('user').orderByChild('color').startAt('a').endAt('a\uf8ff').on('value', handler);

本例中的the\uf8ff只是字符集末尾足够远的字符,结果包括color值以 开头的所有 a节点。


当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

您的回调将需要处理此列表,通过循环使用DataSnapshot.forEach来遍历子项:

function handler(snapshot) {

  snapshot.forEach(function(e) {

    console.log(e.val());

  });

}


database.ref('user').orderByChild('color').startAt('a').on('value', handler);


查看完整回答
反对 回复 2023-05-11
  • 1 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信