firebase数据库批量读取 - 限制读取嵌套数据

时间:2018-06-05 05:34:55

标签: firebase firebase-realtime-database

我有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!

2 个答案:

答案 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)