【问题标题】:orderByChild and startAt firebase realtime using Date timestamp not returning dataorderByChild 和 startAt firebase 实时使用日期时间戳不返回数据
【发布时间】:2018-08-22 20:08:43
【问题描述】:
- foo
|--- -LK7rNAPKZP7drHK1eb_
      |- timeStamp: 1534966072658
|--- -LKAPfu2lLl2B5zInIhX
      |- timeStamp: 1534965117552
|--- -LKJN97VxOhnE8XoNSQN
      |- timeStamp: 1534946072623

db.ref('foo').orderByChild('timeStamp').startAt(Date.now().toString()).limitToLast(7).once('value', data => {
    console.log(data.val());
}

结果为空。当我不放 .startAt 时,我能够获取数据并且它实际上是按时间戳排序的......但是,我需要能够设置 startAt,因为我正在进行无限滚动并且我需要能够指定最后一个时间戳记录。我究竟做错了什么?我想提取前 7 条记录

使用 firebase 实时数据库

【问题讨论】:

    标签: javascript firebase firebase-realtime-database


    【解决方案1】:

    简而言之,不要在Date.now() 上调用toString(),只需将其保留为数字即可。


    来自firebase docs

    4:具有数值的子元素紧随其后,按升序排列。如果 多个孩子对于指定的具有相同的数值 子节点,按key排序。

    5: 字符串在数字之后并且是 按字典顺序升序排序。如果多个孩子有 指定子节点的值相同,它们是有序的 按字典顺序键。

    如您所见,字符串值始终排在数字之后,因此通过在startAt 上指定一个字符串,您可以保证该字段的数值不会出现在结果中。由于您的所有条目都是数字,这意味着您的结果是null

    【讨论】:

    • 我尝试使用没有 .toString() 的日期时间戳,但收到警告说它需要是字符串格式。当我使用 Date.now() 中的普通数字日期对象时间戳时,它也会从 firebase 中返回 null
    • 您在哪里看到此警告?如果你能把它编辑到你的帖子中,我会看看我是否能弄清楚它为什么会出现。但除了警告之外,使用日期作为纯数字是否会从您的数据库中返回正确的结果?
    • 我实际上不再收到任何错误/消息,我只是返回了一个空对象......没有回来
    • 什么是疯狂的......如果我只使用 .orderByChild('timeStamp') 数据会回来并排序。但是,我需要访问 .startAt() ...我需要能够指定要从中返回结果查询的时间戳。这就是问题所在... startAt(Date.now()) .
    • 您似乎想要最近的 7 条记录?在这种情况下,您可以尝试使用.endAt 而不是.startAt。使用startAt(Date.now()) 只会拉取带有未来时间戳的记录。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2020-11-02
    • 2017-11-09
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多