Я пытаюсь найти способ правильно описать мою модель данных с помощью Firestore. Я ищу что-то похожее на то, что делает Tinder, показывая вам людей, которых вы еще не провели, в зависимости от вашего местоположения.
Итак, я получил что-то вроде:
- У пользователя User1 есть массив "встреченных людей"
- A «Еще не встретил пользователя» / User2 его также пользователь с той же моделью документа
- Все они принадлежат к одной коллекции "Users"
- Я хочу опросить всех пользователей, которые еще не провели этот пользователь1
Я знаю, что вы не можете делать что-то вроде "array_not_contains" или "! =", Потому что все поля, которые вы запрашиваете, должны быть проиндексированы.
Итак, мне интересно, возможно ли моделировать данные, чтобы они работали, или единственное решение - удалить Firebase, потому что этот тип запроса вообще невозможен?
Одной из альтернатив может быть сохранение в коллекции всех отношений (с их статусом) между всеми пользователями. Но это также означает, что всякий раз, когда пользователь регистрируется, я должен создавать столько документов, сколько у меня есть действительно уродливых пользователей, и делать огромное количество документов.
EDIT:
Еще раз спасибо за ваш ответ и извините за мой поздний ответ.
Нет необходимости создавать новый вызов базы данных, поскольку вы уже получили всех пользователей из этой области.
Нет Если у меня установлен большой отклик, я ограничусь числом. (5 в примере ниже).
И даже если я не ограничу число, в следующем вызове БД я узнаю, что были добавлены новые люди, и как получить только их.
Я не буду удалять их из Коллекции пользователей, если они могут быть показаны другим пользователям.
P.S: Я забыл User4 в фотографиях из коллекции пользователей.
Для пользователя 1: получить 5 первых совпадений, удалить существующие, показать пользователя 5.
Для User2: получить 5 первых совпадений, удалить существующие, показать User4, User5.
После выбора пользователей, пользователи добавляются в их список. Коллекция пользователей осталась прежней.
Для пользователя 1 получите 5 первых совпадений, удалите существующие, нечего показывать, даже если у меня есть пользователь 6, 7.
Чтобы исправить это, я запускаю второй запрос, получаю новые, но чем больше пользователь использует приложение, тем больше запросов мне может понадобиться, чтобы попытаться показать ему существующего пользователя в его области.
Может быть, я неправильно понял то, что вы назвали «начальный список», для меня это объект списка, извлеченный из моей базы данных, содержащий всех пользователей (с ограничением).
РЕДАКТИРОВАТЬ 2:
Вы можете проверить ответы Алекс Мамо , чтобы узнать, как запрашивать документы, которых нет в массиве.
Позвольте мне объяснить мой вариант использования и почему я думаю, что это не сработает.
Я хочу иметь возможность искать всех пользователей рядом со мной, пытается сделать это в Firebase, я храню Geopoint. На данный момент Geopoint нельзя реально использовать из коробки с Firebase, поэтому я использую Geofirestore в облачной функции.
Я сохраняю и обновляю геопоинты пользователей в зависимости от их местоположения, поэтому это означает, что местоположение пользователя изменяется по времени .
Я ограничиваю количество пользователей, возвращаемых этой функцией.
В исходном состоянии я получаю пользователей рядом со мной (User1), я получаю 3 и 4.
Допустим, я сохраняю последний проверенный userId, чтобы позже использовать его в качестве курсора для моего запроса (пользователь 4).
Теперь моя геопозиция меняется, и пользователи в этой области тоже меняются.
Я запрашиваю следующую группу пользователей рядом со мной и использую свой предыдущий userId / document для «startAfter» (подробнее об этом
здесь ), смотрите изображение ниже, это не сработает.
Если я использую курсор (User4), я возьму 5, но не 2, потому что в списке возврата, если я упорядочу по Id, 2 будет раньше 4.
Хуже того, как показано ниже, если в списке возврата может даже не быть пользователя 4, курсор будет бессмысленным.
Мой пример немного упрощен и не учитывает то, что описано в первом ответе и моем первом редактировании (ограниченное подмножество пользователей, дизайн данных).