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

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"}

}


慕尼黑8549860
浏览 148回答 1
1回答

阿波罗的战车

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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript