Как получить вложенные справочные данные в единицах из документа Firestore?

#javascript #reactjs #firebase #google-cloud-firestore #next.js

#javascript #reactjs #firebase #google-облако-firestore #next.js

Вопрос:

У меня есть две коллекции внутри моей базы данных Firestore.

Во-первых, users это выглядит так:

введите описание изображения здесь

Во-вторых, posts это выглядит так:

введите описание изображения здесь

Я сохраняю reference to user в post документах. Когда я хочу получить a post , я также хочу получить users подробную информацию. Прямо сейчас я должен сделать это примерно так:

 const [userPosts, setUserPosts] = useState([]);

useEffect(async function () {
  if (initialized amp;amp; user) {
    let snap = await firebase.firestore().collection('posts').where("author", "==", firebase.firestore().collection('users').doc(user)).get();
    let docs = snap.docs.map(doc => doc.data());

    for (let i = 0; i < docs.length; i  ) {
      let doc = docs[i];
      docs[i] = { ...doc, author: (await doc.author.get()).data().email }
    }

    setUserPosts(docs);
  }
}, [user]);
 

Проблема с этим подходом заключается в том, что я должен извлекать пользовательский документ для каждого сообщения, а не эффективное решение.

Есть ли лучший способ сделать это?

Ответ №1:

Старайтесь не создавать структуру данных так же, как в традиционной базе данных. Cloud Firestore — это база данных, ориентированная на NoSQL, ориентированная на документы и не имеющая таблиц или строк. Данные хранятся в виде документов и, по сути, представляют собой пары ключ-значение, включая примитивные поля, такие как строки, или сложные объекты, такие как списки.

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

 users:
    userA:
    name: "Donald Duck"
    email: mr.duck@example.com
        posts:
            post1:
                date: 2021-02-09
            post2:
                date: 2021-02-09
    userB:
    ....
 
 var messageRef = db.collection('users').doc('userA')
                .collection('posts').doc('post1');
 

Комментарии:

1. как я могу добавить новый документ postN? Можете ли вы показать код? Как я могу узнать, какой номер сообщения является текущим?