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 中的查询包含两个步骤:
您指定要排序的每个子节点的值,在您的情况下是 的值
color
。Firebase 读取节点,并按该值对它们进行排序。然后指定从哪里开始返回结果,即 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);
添加回答
举报
0/150
提交
取消