Модель запроса базы данных Firebase Realtime для вашего кода работает следующим образом:
- Она упорядочивает дочерние узлы ссылки по указанному вами дочернему элементу.
- Находитпоследний узел в результате, а затем возвращает 1000 узлов до этого.
Вы можете добавить условие к вашему запросу с помощью startAt()
, endAt
и / или equalTo
, поэтому сделайтеначало / конец базы данных в определенном наборе дочерних узлов в диапазоне.Но в этих условиях невозможно пропустить дочерние узлы посередине.Как только база данных найдет дочерний узел для начала возврата, она будет возвращать все дочерние узлы оттуда до тех пор, пока условия не перестанут выполняться.
Самый простой способ, который я могу придумать для реализации вашего требования, - это сохранитьданные в области агрегации, которые вы хотите запросить.Поэтому, если вы хотите разрешить чтение данных таким образом, чтобы вы получали первый и последний элемент каждой недели, а также первый и последний элемент каждой недели, вы должны сохранить:
2019w24_first: "-LhIaB7SP0y-FLb1xFFx",
2019w24_last: "-LhIbSGKvS2POggUCots",
2019m06_first: "-LhIaB7SP0y-FLb1xFFx",
2019m06_last: "-LhIbSGKvS2POggUCots"
И затемкаждый раз, когда вы пишете данные, вы также обновляете соответствующие агрегаты.
Это звучит невероятно неэффективно для людей, которые имеют опыт работы с реляционными базами данных / базами данных SQL, но на самом деле это очень часто встречается в базах данных NoSQL.Когда ваши операции записи выполняют некоторую дополнительную работу и сохраняют дубликаты данных, ваши операции чтения становятся значительно более масштабируемыми.
Для получения дополнительной информации об этих типах моделирования данных я рекомендую: