#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? Можете ли вы показать код? Как я могу узнать, какой номер сообщения является текущим?