Запрос группы сбора Firestore на documentId - PullRequest
3 голосов
/ 15 мая 2019

В моем сценарии пользователь может «понравиться» профилю другого пользователя. В результате у меня есть подколлекция с именем «likesBy» для каждого пользователя, где я создаю документ для конкретного пользователя, например:

пользователи (столбец) -> пользователь A (документ) -> понравившийся пользователь (столбец) -> пользователь B (документ), пользователь C (документ)

Таким образом, в редком случае удаления пользователя я хочу удалить все подобные ему проблемы.

Я просто не уверен, возможно ли это вообще (можно обойти это, просто снова сохранив userId в указанном документе и запросив его).

То, что я в основном ищу, примерно так:

db.collectionGroup('likedBy').where(firebase.firestore.FieldPath.documentId(), '==', "User A").get();

Проблема в том, что я не могу создать индекс для documentId в консоли Firestore.

1 Ответ

2 голосов
/ 15 мая 2019

Невозможно использовать следующий запрос:

db.collectionGroup('likedBy').where(firebase.firestore.FieldPath.documentId(), '==', "User A").get();

И это потому, что запросы групп сбора работают только со свойствами документа и , а не с идентификаторами документов.Согласно официальной документации, касающейся запросов группы сбора :

db.collectionGroup('landmarks').where('type', '==', 'museum');

Вы запрашиваете подколлекцию landmarks, где свойство type содержит значение museum.

Обходным путем может быть сохранение идентификатора пользователя в массиве и использование array-contains, но помните, что для каждого используемого вами запроса группы сбора вам нужен индекс, и, к сожалению, вы не можете создать такой индекс программно.Даже если вы можете создать индекс в консоли Firebase, это не поможет вам, поскольку вы получаете эти идентификаторы динамически.Поэтому нельзя создать индекс для каждого пользователя отдельно, потому что вы очень быстро достигнете максимального количества индексов 1018 *.

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

Чтобы решить проблемы такого рода, вам следует рассмотреть возможность добавления массива под каждый объект пользователя и использовать такой запрос:

usersRef.where("usersWhoLikedMe", "array-contains", "someUserId")

Где usersWhoLikedMe - это свойствотипа массив.

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