Что делать, если пользовательский индекс не доступен в Firestore - PullRequest
0 голосов
/ 20 мая 2018

В моей базе данных Cloud Firestore у меня есть коллекция users и коллекция events.user может посещать несколько событий, запрашивая их у владельца, поэтому в каждом event я отслеживаю это, как показано ниже:

enter image description here Запрос на получениевсе события, в которых участвует user:

String participating = "participants_id." + myUserID;
query = FirebaseFirestore.getInstance().collection("events").whereEqualTo(participating, true);

Проблема в том, что если я хочу разбить эти результаты на страницы, мне нужно order и limit запрос, и для этого требуется собственный индекс,Таким образом, этот индекс будет необходим для каждого поля "participants_id." + myUserID, которое не масштабируется (максимальный настраиваемый индекс - 200).

Так как я могу решить эту проблему?Я мог бы денормализовать коллекцию events и добавить подколлекцию participating для каждого пользователя, также копирующего документ события.Но я бы предпочел избегать денормализации, если это возможно, так как это становится немного грязным.Есть ли лучший вариант?

1 Ответ

0 голосов
/ 21 мая 2018

Cloud Firestore автоматически создает индексов на отдельных полях ваших документов.Сложные индексы, охватывающие несколько полей, могут быть созданы только вручную в Firebase Console .К сожалению, вы не можете программно создавать индексы, по крайней мере, на данный момент.

В вашем сценарии вы обязательно должны использовать денормализацию.Одна из причин использования денормализации состоит в том, что существует также ограничение на максимальный размер документа, равное 1Mib.Поэтому, если у вас слишком много участников, вы можете очень быстро достичь этого предела.См. Здесь Квоты и ограничения Firestore .

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

Firestore-root
   |
   --- users (collection)
   |      |
   |      --- userId (document)
   |           |
   |           --- //user details
   |
   --- userEvents (collection)
   |     |
   |     --- userId (document)
   |           |
   |           --- events (collection)
   |                 |
   |                 --- eventId
   |                       |
   |                       --- //event details
   |
   --- events (collection)
         |
         --- eventId (document)
               |
               --- //event details

Использование этогоСтруктура базы данных, вы можете очень быстро запросить вашу базу данных, чтобы получить все события, которые соответствуют конкретному пользователю.И, насколько я знаю, это единственные варианты, которые у вас есть.

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