【问题标题】:Firebase's Realtime Database's `startAt` isn't working as expectedFirebase 实时数据库“启动”未按预期工作
【发布时间】:2021-01-29 05:17:45
【问题描述】:

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

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

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

    1. 您指定每个子节点的排序依据,在您的情况下是color 的值。 Firebase 读取节点,并按该值对它们进行排序。
    2. 然后您指定从哪里开始返回结果,即子a。由于您没有指定结束条件,因此 Firebase 会从其开始处返回所有子节点。

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

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

    此示例中的\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);
    

    【讨论】:

    • 谢谢。我不明白startAt('a')startAt('a').endAt('a\uf8ff') 之间的区别。我见过有人使用 `startAt('a') 来完成类似的任务并且它有效(在这里 29 分钟:youtube.com/watch?v=2CtQEXwOPXw
    • 正如我在回答中所说,您似乎认为startAtstartsWith 操作,但事实并非如此。如果您不了解其中的区别,我建议您首先尝试我的答案中的代码,然后使用 endAt 的各种值,直到它有意义为止。视频中的场景起作用的原因是它们从列表中的最后一项开始。
    • 这是真的吗:orderByChild("color") 根据color 的值按字母顺序排列人员?然后startAt 找到color 的第一个字符是"a" 的人,并包括它下面的所有人(基于这个新的排序方案)?
    • 是的,这就是 Firebase 查询的工作方式:您首先告诉 Firebase 要加载哪个索引(其中的数据以某种方式排序),然后返回数据的哪一部分。
    • 太棒了。您介意解释一下endAt 的工作原理(与startAt 一起使用)吗?然后我可以实施你的解决方案,知道它做什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    相关资源
    最近更新 更多