Реляционная модель данных Firestore - PullRequest
0 голосов
/ 23 сентября 2018

Я учусь использовать Cloud Firestore на Android, и до сих пор не могу найти ответы на некоторые вопросы.

  1. Можно ли получить список документов, указавсписок идентификаторов или ссылок без выполнения отдельных запросов для каждого идентификатора?Пока что это кажется невозможным.
  2. Возможно ли включить ссылочный объект из поля документа при запросе документа, не выполняя второй запрос для этого ссылочного объекта?Кажется, вы не можете в данный момент.
  3. У меня есть корневая коллекция магазина и отдельная корневая коллекция для товаров в этом магазине.Я хочу иметь возможность сортировать магазины по указанному пункту, где это дешевле.Но у меня есть проблема, поскольку, если я сортирую товары по цене и получаю около 1000 результатов, мне нужно выполнить 1000 запросов, чтобы получить реальные магазины, которые содержат эти товары.Как бы я это оптимизировал?

Я не был уверен, стоит ли мне создавать 3 отдельных SO-вопроса для этого, поэтому я просто собрал их в один.Дайте мне знать, если это неправильный подход.

1 Ответ

0 голосов
/ 23 сентября 2018
  1. Можно ли получить список документов, указав список идентификаторов или ссылок без выполнения отдельных запросов для каждого идентификатора?Пока что это кажется невозможным.

Да, это возможно.Метод whenAllSuccess задач (и другие whenAll методы) доставит результаты задач обратному вызову в List в том порядке, в котором они были переданы методу whenAllSuccess().Итак, как вы видите в официальной документации, вы можете передать в качестве аргумента Collection<? extends Task<?>>. Здесь - это пример использования ссылок.

Можно ли включить ссылочный объект из поля документа при запросе документа, не выполняя второй запрос для этого ссылочного объекта?Кажется, вы не можете в данный момент.

Да, это возможно.Ответ из приведенного выше примера, это то, что он делает.Если вы хотите использовать отдельные запросы, вы также можете взглянуть на другой подход здесь .Вы также получите список.

У меня есть корневая коллекция магазина и отдельная корневая коллекция для предметов в этом магазине.Я хочу иметь возможность сортировать магазины по указанному пункту, где это дешевле.Но у меня есть проблема, поскольку, если я сортирую товары по цене и получаю около 1000 результатов, мне нужно выполнить 1000 запросов, чтобы получить реальные магазины, которые содержат эти товары.Как бы это оптимизировать?

Запросы в Firestore мелкие: они получают только элементы из коллекции, с которой выполняется запрос.Невозможно получить документы из коллекции верхнего уровня и других коллекций или вложенных коллекций в одном запросе.Firestore не поддерживает запросы к различным коллекциям за один шаг.Один запрос может использовать свойства документов только в одной коллекции.Таким образом, чтобы решить эту проблему, вам нужно добавить к каждому товару новое свойство, которое на самом деле должно быть идентификатором магазина.Чтобы получить весь магазин с самыми дешевыми товарами, вы должны запросить коллекцию товаров, получить самые дешевые товары, а затем запросить еще раз, чтобы получить данные о магазине, в котором продается товар.

Редактировать:

Как правило, люди переоценивают количество использования, которое они получат.Итак, еще раз (в целом), я рекомендую не беспокоиться об оптимизации, пока она вам действительно не понадобится.Однако, что касается № 1, да, он выполняет кучу запросов, но именно так это можно сделать в Firestore.Но не волнуйтесь, Firestore работает очень хорошо в такой ситуации.Что касается № 2 и № 3, нет, он не выполняет конкатенацию запросов, однако он также работает очень быстро, даже если вы используете два запроса.С вложенными слушателями все в порядке.

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