让我们假设上面的firebase数据库架构。
我想要的是在“15039996197”时间戳之后检索消息。每个消息对象都有createdAt
属性。
如何在特定时间戳之后才能收到邮件?在这种情况下,最后两条消息是我想要检索的。
我尝试firebaseb.database().ref(`/rooms/$roomKey/messages`).startAt('15039996197')
但失败了。它返回0.我怎么能这样做?
答案 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()。