Firestore: упорядочить по полю сбора - PullRequest
0 голосов
/ 08 мая 2019

Прежде всего, это не обычный вопрос. Это немного сложно.

Сводка приложения

Приложение рецептов, где пользователи могут искать рецепты по выбранным ингредиентам (коллекция ингредиентов существует в базе данных Firestore db). Я хочу хранить для каждого ингредиента статистику того, сколько пользователи искали с этим выбранным ингредиентом, поэтому я смогу показать их позже в основных ингредиентах, которые они использовали в основном для поиска рецептов.

Вот так выглядит моя коллекция:

http://prntscr.com/nlz062

А теперь я бы хотел упорядочить рецепты по статистике созданных вошедших в систему пользователей.

first = firebaseHelper
                    .getDb()
                    .collection(Constants.INGREDIENTS_COLLECTION)
                    .orderBy("statistics." + firebaseHelper.getCurrentUser().getUid() + ".count")
                    .limit(25);

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

Примечание: статистика может существовать или не существовать для авторизованного пользователя, все зависит от его поиска.

1 Ответ

1 голос
/ 08 мая 2019

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

На сегодняшний день (с использованием новейших клиентских библиотек Firestore) вы можете вместо этого выполнить запрос группы сбора , чтобы запросить все подколлекции, называемые «статистикой», для их поля счетчика. Тем не менее, это все равно только даст вам документы статики. Вам нужно будет выполнить итерацию этих документов, проанализировать идентификатор документа ингредиента из его ссылки и по отдельности получить () каждый из этих документов для отображения пользовательского интерфейса.

Запрос группы сбора в JavaScript будет выглядеть примерно так:

firestore
    .collectionGroup("statistics")
    .where(FieldPath.documentId())
    .orderBy("count")
    .limit(25)

Вы должны быть в состоянии повторить эти результаты и получить соответствующие документы без проблем.

...