2017-08-29 100 views
0

enter image description here如何在Firebase查询中使用startAt()?

让我们假设上面的firebase数据库模式。

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

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

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

回答

2

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

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

这样它会返回内部message具有一个名为createdAt的它开始于15039996197孩子的所有节点。订购你的查询可能会对性能有点不好,因为我喜欢看看.indexOn规则。

欲了解更多信息,请看看here

希望这会有所帮助。

+0

JSON显示时间戳存储为一个数字,所以'.startAt(15039996197)'。 –

+0

@FrankvanPuffelen嗨。我能问你一件事吗?你知道哪个数据模式是正确的吗? '1。使用时间戳作为Rishabh的回答'vs vs 2'的关键字。使用我以前的数据模式和查询与.orderByChild和.startAt' – Juntae

+0

我想使用时间戳作为关键,但查询失败。 'fb.database()。ref(/ rooms/$ roomKey/messages).startAt(timestam p)' – Juntae

1

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

你会想重构你存储数据的方式,并把createdAt放在Node而不是Child中。

+1

作为您的推荐,我使用时间戳作为关键。但'fb.database()。ref('/ rooms/$ roomKey/messages').startAt(timestamp)''不起作用。任何想法 ?? – Juntae

相关问题