让我们假设上面的firebase数据库模式。
我想要的是检索“15039996197”时间戳后的邮件。每个消息对象都有一个createdAt
属性。
如何在特定时间戳之后才能获取消息?在这种情况下,最后两条消息是我想要检索的。
我试过firebaseb.database().ref(`/rooms/$roomKey/messages`).startAt('15039996197')
但失败。它返回0.我该怎么做?
让我们假设上面的firebase数据库模式。
我想要的是检索“15039996197”时间戳后的邮件。每个消息对象都有一个createdAt
属性。
如何在特定时间戳之后才能获取消息?在这种情况下,最后两条消息是我想要检索的。
我试过firebaseb.database().ref(`/rooms/$roomKey/messages`).startAt('15039996197')
但失败。它返回0.我该怎么做?
与您的查询的情况是,它期望message
节点应该有一个数字值开始,在这种情况下,你想要一个名为createdAt
的子节点。因此,在这种情况下,你必须指定您希望通过createdAt
订购,因此你需要做的这个
firebase.database().ref(`/rooms/$roomKey/messages`).orderByChild('createdAt').startAt('15039996197').on(//code);
这样它会返回内部message
具有一个名为createdAt
的它开始于15039996197
孩子的所有节点。订购你的查询可能会对性能有点不好,因为我喜欢看看.indexOn规则。
欲了解更多信息,请看看here。
希望这会有所帮助。
Firebase Data Retrieval逐节点地工作。 因此,无论您想要获取什么数据,整个节点都会被遍历。 所以在你的情况下得到任何消息,你的复杂性将是O(消息的数量)。
你会想重构你存储数据的方式,并把createdAt放在Node而不是Child中。
作为您的推荐,我使用时间戳作为关键。但'fb.database()。ref('/ rooms/$ roomKey/messages').startAt(timestamp)''不起作用。任何想法 ?? – Juntae
JSON显示时间戳存储为一个数字,所以'.startAt(15039996197)'。 –
@FrankvanPuffelen嗨。我能问你一件事吗?你知道哪个数据模式是正确的吗? '1。使用时间戳作为Rishabh的回答'vs vs 2'的关键字。使用我以前的数据模式和查询与.orderByChild和.startAt' – Juntae
我想使用时间戳作为关键,但查询失败。 'fb.database()。ref(/ rooms/$ roomKey/messages).startAt(timestam p)' – Juntae