我有topics
* tasks
的这个firebase数据库结构。对于每个主题,具有不同记录的相同任务(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)
THX!
答案 0 :(得分:2)
您可以对数据进行非规范化,并将另一个节点添加到现有数据库结构中,以便于查询:
let query = {...query, $or: makeTextFilter(textInputFromUser)}
tableName.find(query, function (err, cargo_list)
在NoSQL数据库建模中,以这样一种方式复制数据是非常经典的,它可以促进/优化您的查询。
为了同时写入两个节点(“topics”和“topicsTasks”),您可以使用"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",
...
},
....
方法,如下所述:https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields
要查询最近的10个项目,请执行以下操作:
update()
请注意,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);
});
是一个查询。有关查询的文档位于:https://firebase.google.com/docs/reference/js/firebase.database.Query
答案 1 :(得分:0)
没有API可以限制跨主题的任务总数。
如果这是您要实现的用例,请考虑向您的JSON添加一个允许它的数据结构,例如:拥有包含其主题的所有任务的列表,并将时间戳更新为属性。类似的东西:
"lastTaskUpdates": {
"task1": { "lastUpdate": "ts123": topic: "topic1" },
"task2": { "lastUpdate": "ts154": topic: "topic2" },
...
},
现在,您可以在/lastTaskUpdates/taskId
轻松查找特定任务的上次更新,并通过以下方式查询最近更新的任务:
db.child("lastTaskUpdates").orderByChild("lastUpdate").limitToLast(10)