Получить все документы в коллекции Firebase - React - PullRequest
0 голосов
/ 05 мая 2020

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

У меня есть такие данные:

collection -> doc -> collection -> doc

enter image description here Приносим извинения, если сообщения - сообщения сбивают с толку!

И это данные на уровне root: enter image description here Я думал, что что-то вроде этого сработает:

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 }));
      setPosts(postData);
    });
  }, []);

  console.log(posts);

но это просто регистрирует пустой массив, когда он должен быть массивом из двух объектов.

Может ли кто-нибудь пролить свет на то, где я ошибаюсь? И смогу ли я получить доступ к вложенным данным, сделав это?

1 Ответ

1 голос
/ 05 мая 2020

Обновление после вашего комментария и добавления скриншота

Мы видим, что документы в родительской коллекции 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 неглубокие. Если вы хотите запросить подколлекцию, вам необходимо выполнить дополнительный запрос.

...