Запрос дальности огня на поле карты - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть коллекция conversations, у каждого разговора есть hidden<Map>, где каждый участник является ключом, имеет логическое значение, так что я могу видеть, архивировал ли он разговор с его стороны или нет.Поэтому запрос выглядит следующим образом:

store.conversations
    .where( 'participants', 'array-contains', uid )
    .where( `hidden.${uid}`, '==', false )
    .orderBy( 'createdAt', 'desc' )

Проблема возникает при добавлении orderBy, что делает его запросом «диапазона».Итак, учитывая, что каждый документ имеет свой набор ключей в hidden<Map>, Firestore предлагает следующее, что, очевидно, не сработает:

participants Arrays 
hidden.`48m6lKjwvKUOboAxlc0ppX2R7qF2` Ascending 
createdAt Descending

Как мне обойти это?Я думаю, что выравнивание Map было бы решением, но не самым элегантным.Любой совет?

1 Ответ

0 голосов
/ 07 февраля 2019

Firestore предлагает следующее, что, очевидно, не сработает:

participants Arrays 
hidden.`48m6lKjwvKUOboAxlc0ppX2R7qF2` Ascending 
createdAt Descending

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

максимальное количество составных индексов для базы данных: 200

Число, которое может быть достигнуто очень быстро.

Полагаю, что выравнивание карты было бы решением

Вы угадали.Эта практика также называется denormalization и является обычной практикой, когда дело доходит до Firebase.Если вы новичок в базах данных NoQSL, я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase для лучшего понимания.Это для базы данных реального времени Firebase, но те же правила применяются к Cloud Firestore.

Кроме того, когда вы дублируете данные, есть одна вещь, которую нужно иметь в виду.Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны сделать это в каждом месте, где он существует.

Для получения дополнительной информации, пожалуйста, также посмотрите мой ответ из следующего поста:

Таким образом, вы можете денормализовать свою базу данных и создать conversations без необходимости создания индексов.Для вашего варианта использования вам следует рассмотреть возможность дополнения структуры данных, чтобы разрешить обратный поиск, создав новую коллекцию или вложенную коллекцию с именем userConversations, которая может хранить в качестве документов все разговоры, которые имеет пользователь.Для простого запроса индекс не нужен.

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