Полагаю, вы задавали 2 вопроса.
Во-первых, Firestore рекомендует дублировать данные, а не объединять запросы между коллекциями. То, как вы создали пост и пользователя, должно опираться на концепцию запросов в SQL.
Этого все еще можно достичь, если вы не возражаете против того, чтобы все идентификаторы друга автора были массивом внутри этого пост-документа. Между тем, вы должны синхронизировать массив друзей автора через функцию триггера, когда автор добавляет / удаляет друзей.
Я бы не стал рекомендовать это решение, потому что в качестве социальной платформы друзья пользователя могут постоянно меняться, и вам придется постоянно обновлять массив друзей всего его сообщения.
Существует еще одно решение, которое заключается в добавлении еще одной вложенной коллекции под пользователем в качестве его видимых «каналов». Затем всякий раз, когда автор создает сообщение, триггерная функция записывает сводку этого сообщения в видимую коллекцию «каналов» своих друзей.
Однако оба вышеупомянутых решения не идеальны, если вы беспокоитесь о точности, реальном времени, стоимости и т. Д. Я полагаю, что с этим недостатком мы должны столкнуться. Если вам нужно добиться того же, что и в SQL, я думаю, что единственный вариант - использовать другие решения для части запроса, такие как упругий поиск, mysql, neo4j и т. Д. PS: Вы все еще можете обернуть его облачными функциями.
Что касается вашего второго вопроса, один из способов - не дублировать имя пользователя, если вы думаете, что ваш пользователь будет часто менять свое имя. И всегда запрашивать имя пользователя по идентификатору пользователя из коллекции пользователей. Другой способ - использовать функцию триггера для обновления дублированного имени пользователя, когда пользователь меняет свои имена. Я бы порекомендовал второй способ, так как пользователь не будет часто менять свои имена.