如何在Firebase查询中使用startAt()?

时间:2017-08-29 09:55:27

标签: firebase firebase-realtime-database

enter image description here

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

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

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

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

4 个答案:

答案 0 :(得分:7)

您的查询的情况是,它期望message节点应该有一个数字值,在这种情况下,您需要一个名为createdAt的子节点。因此,在这种情况下,您必须指定要按createdAt订购,因此您需要执行此操作

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

通过这种方式,它会返回message内的所有节点,这些节点有一个名为createdAt的子节点,它从15039996197开始。对你的查询进行排序可能对性能有点不利,因为我最后看看.indexOn规则。

有关详细信息,请查看here

希望这有帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

如果您的数据库结构看起来像这样,则可以使用:

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密钥是字符串类型,因此您需要确保将.startAt()中的时间戳解析为字符串。

它看起来像这样:

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

答案 3 :(得分:-1)

您可以执行以下操作:

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()。