firebase - 批量读取firebase数据库 - 限制读取嵌套数据
问题描述
我有这个topics
*的 firebase 数据库结构tasks
。对于每个主题,都有具有不同记录的相同任务(tsX = 一些时间戳)。
"topic1": {
"task1": {
"ts123": "record data",
"ts212": "record data",
...
},
"task2": {
"ts154": "record data",
"ts223": "record data",
...
},
"topic2": {...},
...
如何仅检索按时间戳排序的最多 X 条记录的主题和任务的每个组合?预期结果是同一棵树,但叶子(记录)数量有限。
topics
*的数量tasks
可能在 100 * 50 左右,所以我想避免执行#topics * #tasks
读取操作。有没有办法在一个/批量读取中做到这一点?
(我正在使用 fb db client for web)
谢谢!
解决方案
您可以对数据进行非规范化并将另一个节点添加到现有的数据库结构中,这将有助于您的查询:
"topics": {
"topic1": {
"task1": {
"ts123": "record data",
"ts212": "record data",
...
},
"task2": {
"ts154": "record data",
"ts223": "record data",
...
},
"topic2": {...},
...
},
"topicsTasks": { // <- new first level node
"topic1_task1": {
"ts123": "record data",
"ts212": "record data",
...
},
"topic1_task2": {
"ts123": "record data",
"ts212": "record data",
...
},
"topic2_task1": {
"ts123": "record data",
"ts512": "record data",
...
},
"topic2_task2": {
"ts183": "record data",
"ts282": "record data",
...
},
....
在 NoSQL 数据库建模中,以促进/优化查询的方式复制数据是非常经典的。
为了同时写入两个节点(“主题”和“主题任务”),您将使用该update()
方法,如下所述:https ://firebase.google.com/docs/database/web/read-and-write #update_specific_fields
为了查询最近的 10 个项目,您可以执行以下操作:
database.ref('topicsTasks/topic1_task1').limitToLast(10).once("value")
.then(snapshot => {
snapshot.forEach(doc => {
console.log(doc.val());
});
})
.catch(err => {
console.log('Error getting documents', err);
});
请注意,这database.ref('topicsTasks/topic1_task1').limitToLast(10)
是一个查询。关于查询的文档在这里:https ://firebase.google.com/docs/reference/js/firebase.database.Query
推荐阅读
- r - R中的预测人数
- postgresql - 使用 kubectl apply 命令重新配置 postgres
- mysql - 错误号:1137 无法重新打开表:'d'
- swift - Swift:接受子类的协议
- mysql - 在 MySQL 中使用用户定义的变量从前一行获取值
- javascript - 如何登录异步/等待上下文
- tomcat - 如何让tomcat从webpack开发服务器提供静态文件?
- java - 如果员工任期超过三年,则包含员工数据的程序调用 main 中的所有函数(在 java 中)
- scala - 如何通过参数Class生成Function1并返回Class
- ruby-on-rails - Doorkeeper Rake 任务中未初始化的常量 Doorkeeper::AccessToken