首页 > 解决方案 > 批量读取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)

谢谢!

标签: firebasefirebase-realtime-database

解决方案


您可以对数据进行非规范化并将另一个节点添加到现有的数据库结构中,这将有助于您的查询:

"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


推荐阅读