чтение базы данных firebase в пакетном режиме - ограничение чтения вложенных данных - PullRequest
0 голосов
/ 05 июня 2018

У меня есть структура базы данных firebase topics * 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 для веб)

THX!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Нет API, который бы ограничивал общее количество задач по темам.

Если вы хотите реализовать этот вариант использования, рассмотрите возможность добавления структуры данных в свой JSON, которая позволяет это, например, наличие списка всех задач с их темой и обновление метки времени в качестве свойства.Что-то вроде:

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

Теперь вы можете легко найти последнее обновление для конкретной задачи на /lastTaskUpdates/taskId и запросить последние обновленные задачи с помощью:

db.child("lastTaskUpdates").orderByChild("lastUpdate").limitToLast(10)
0 голосов
/ 05 июня 2018

Вы можете денормализовать ваши данные и добавить в существующую структуру базы данных еще один узел, который облегчит ваш запрос:

"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 довольно классно дублировать данные таким образом, чтобы облегчить /оптимизирует ваши запросы.


Для одновременной записи в два узла ("themes" и "themesTasks") вы должны использовать метод 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) - это запрос.Док о Query находится здесь: https://firebase.google.com/docs/reference/js/firebase.database.Query

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...