【问题标题】:How to use startAt() in Firebase query?如何在 Firebase 查询中使用 startAt()?
【发布时间】:2017-08-29 09:55:26
【问题描述】:

让我们假设上面的 firebase 数据库架构。

我想要的是检索“15039996197”时间戳之后的消息。每个消息对象都有一个createdAt 属性。

如何仅在特定时间戳之后才能收到消息?在这种情况下,最后两条消息是我要检索的。

我尝试了firebaseb.database().ref(`/rooms/$roomKey/messages`).startAt('15039996197'),但失败了。它返回 0。我该怎么做?

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    您的查询的情况是,它期望message 节点应该有一个数字值开头,在这种情况下,您需要一个名为createdAt 的子节点。所以在这种情况下你必须指定你想通过createdAt订购,因此你需要这样做

    firebase.database().ref(`/rooms/$roomKey/messages`).orderByChild('createdAt').startAt('15039996197').on(//code);
    

    这样,它将返回 message 内的所有节点,这些节点具有一个名为 createdAt 的子节点,并且它从 15039996197 开始。对查询进行排序可能对性能有点不利,因为我建议查看 .indexOn 规则。

    更多信息请查看here

    希望这会有所帮助。

    【讨论】:

    • JSON显示时间戳存储为数字,所以.startAt(15039996197)
    • @FrankvanPuffelen 你好。我能问你一件事吗?你知道哪个是正确的数据模式吗? 1. Use timestamp as a key like Rishabh's answer2. Use my previous data schema and query with .orderByChild and .startAt
    • 我正在尝试使用时间戳作为键,但查询失败。 fb.database().ref(/rooms/$roomKey/messages).startAt(timestam‌​p)
    • 没有单一的 proper 架构,它始终取决于您应用的用例。但是您当前的查询没有得到结果的事实是由于代码中的两个问题:1)您需要调用orderBy("createdAt")(如Gabriel在答案中所示)2)您需要将一个数字传递给@ 987654334@,因为您将时间戳(正确)存储为数字。
    【解决方案2】:

    Firebase 数据检索逐个节点工作。 所以无论你想得到什么数据,都会遍历整个节点。 因此,在您的情况下,要获取任何消息,您的复杂性将是 O(消息数)。

    您可能希望重新构建存储数据的方式,并将 createdAt 放在 Node 中而不是 Child 中。

    【讨论】:

    • 根据您的建议,我使用时间戳作为键。但fb.database().ref(/rooms/$roomKey/messages).startAt(timestamp) 不起作用。有什么想法吗??
    【解决方案3】:

    如果你的数据库结构是这样的,你可以使用:

    firebase.database()
         .ref(`/rooms/$roomKey/messages`)
         .orderByChild('createdAt')
         .startAt('15039996197').on('value', snapshot => { /* your code here */ });
    

    但是,如果您处理大量数据条目,您还可以使用时间戳命名项目键,而不是将时间戳存储在数据中。这会在您的数据库中节省一些数据。

    firebase.database().ref(`${rooms}/${roomKey}/${timestamp}`).set("value");
    

    要在这种情况下检索数据而不是 orderByChild('createdAt'),您将使用 orderByKey()。因为firebase键是字符串类型的,所以需要shure将.startAt()中的时间戳解析为字符串。

    然后它看起来像这样:

    firebase.database()
         .ref(`/rooms/$roomKey/messages`)
         .orderByKey()
         .startAt(`${15039996197}`).on('value', snapshot => { /* your code here */ });
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      firebase.database().ref('/rooms/$roomKey/messages')
                      .orderByChild('createdAt')
                      .startAt('150399')
                      .endAt('1503999\uf8ff')
                      .on('value', function (snapshot) {
                          var key = snapshot.key,
                          data = snapshot.val();
                          console.log(key + ': ' + JSON.stringify(data))
                      });
      

      一定要设置 endAt()。

      【讨论】:

      • 这只会获取具有该特定时间戳的消息,而不是获取该时间戳之后的所有消息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 2015-06-28
      • 2016-10-14
      • 2020-04-09
      • 1970-01-01
      相关资源
      最近更新 更多