代码之家  ›  专栏  ›  技术社区  ›  Petr Marek

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

  •  1
  • Petr Marek  · 技术社区  · 6 年前

    我有一个firebase数据库结构 topics * tasks . 对于每个主题,都有相同的任务和不同的记录(tsx=一些时间戳)。

    "topic1": {
      "task1": {
        "ts123": "record data",
        "ts212": "record data",
        ...
      },
      "task2": {
        "ts154": "record data",
        "ts223": "record data",
        ...
      },
    "topic2": {...},
    ...
    

    如何检索主题和任务的每个组合,最多只能检索按时间戳排序的x条记录?预期结果是同一棵树,但叶子(记录)数量有限。

    数量 话题 * 任务 可能在100*50左右,所以我想避免表演 #topics * #tasks 读取操作。有没有办法在一次/批读取中做到这一点?

    (我正在使用FB DB客户端进行Web)

    谢谢!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Renaud Tarnec    6 年前

    您可以取消数据的规格化,并将另一个节点添加到现有的数据库结构中,以方便查询:

    "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数据库建模中,以方便/优化查询的方式复制数据是非常经典的。


    为了同时写入两个节点(“topics”和“topicstasks”),您可以使用 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

        2
  •  0
  •   Frank van Puffelen    6 年前

    没有任何api可以限制跨主题的任务总数。

    如果这是您想要实现的一个用例,请考虑向json中添加一个允许它实现的数据结构,例如,有一个包含主题和更新时间戳的所有任务的列表作为属性。类似于:

    "lastTaskUpdates": {
      "task1": { "lastUpdate": "ts123": topic: "topic1" },
      "task2": { "lastUpdate": "ts154": topic: "topic2" },
      ...
    },
    

    现在,您可以在 /lastTaskUpdates/taskId 并使用以下命令查询最近更新的任务:

    db.child("lastTaskUpdates").orderByChild("lastUpdate").limitToLast(10)