Обновление после вашего комментария и добавления скриншота
Мы видим, что документы в родительской коллекции posts
отображаются с itali c font в консоли Firebase: это потому, что эти документы присутствуют (в консоли) только как «контейнер» одной или нескольких подколлекций, но они не являются «подлинными» документами.
Фактически, если вы создаете документ напрямую в коллекции col1
с полным путем doc1/subCol1/subDoc1
промежуточные документы создаваться не будут (т. е. документ doc1
).
Консоль Firebase показывает этот тип «контейнера» (или «заполнителя») ) курсивом, чтобы «материализовать» иерархию и позволить вам перейти к документу subDoc1
, но doc1
документ не существует в базе данных Firestore .
Давайте возьмем пример: представьте себе документ doc1
в коллекции col1
col1/doc1/
и еще один subDoc1
в коллекции subCol1
(под)
col1/doc1/subCol1/subDoc1
Фактически , из с технической точки зрения они никак не связаны друг с другом. Они просто разделяют часть своего пути, но ничего больше. Одним из побочных эффектов этого является то, что если вы удалите документ, его подгруппы все еще существуют.
Итак, это нормально, что вы получаете пустой массив при выполнении db.collection('posts').onSnapshot((snapshot) => {...})
, потому что вы слушаете в несуществующие документы.
Что вы можете сделать, так это прослушать документы в одной из подколлекций posts
следующим образом:
db.collection('posts').doc('frlGy...').collection('posts').onSnapshot((snapshot) => {...});
Другой вариант - использовать запрос Группы сбора , чтобы получить все элементы во ВСЕХ вложенных коллекциях posts
. Но в этом случае у вас не может быть родителя и вложенных коллекций с одинаковым именем (например, posts
).
Обновление после вашего второго комментария
Нужно ли мне делать по-другому, если я, например, хочу иметь возможность регистрировать все сообщения от всех пользователей, поскольку документы пользователей технически не существуют?
Все зависит от того, есть ли у вас какие-то user
документы или нет , что непонятно.
Если вы это сделаете, для каждого из этих user
документов создайте вложенную коллекцию posts
и используйте db.collection('Users').doc(user.uid).collection('posts').onSnapshot((snapshot) => {...});
. Вы также можете использовать группу коллекции запрос для запроса к различным субколлекциям posts
.
Если у вас нет документов user
, вы можете создать глобальную коллекцию posts
(root коллекцию), и вы сохраните пользователя uid
как поле каждого post
документа. Таким образом вы можете защитить их (с помощью правил безопасности), а также запросить все сообщения пользователя. Вы также можете легко запрашивать сообщения среди всех пользователей.
Вам нужно поместить console.log
в обратном вызове, как показано ниже:
const [posts, setPosts] = useState();
useEffect(() => {
const db = firebase.firestore();
return db.collection('posts').onSnapshot((snapshot) => {
const postData = [];
snapshot.forEach((doc) => postData.push({ ...doc.data(), id: doc.id }));
console.log(postData); // <------
setPosts(postData);
});
}, []);
Также обратите внимание, что это вернет только документ frlGy...
, а не тот, что находится в подколлекции: как сказано выше, запросы Firestore неглубокие. Если вы хотите запросить подколлекцию, вам необходимо выполнить дополнительный запрос.