次の構造のCloudFirestoreDBがあります。
実際のDBにはさらに多くのデータが存在します。上記は、コレクション/ドキュメント/フィールドの構造を示しています。
Webアプリに投稿を表示しているビューがあり、投稿したユーザーの名前を表示したいと思います。以下のクエリを使用して投稿を取得しています。
let loadedPosts = {};
posts = db.collection('posts')
.orderBy('timestamp', 'desc')
.limit(3);
posts.get()
.then((docSnaps) => {
const postDocs = docSnaps.docs;
for (let i in postDocs) {
loadedPosts[postDocs[i].id] = postDocs[i].data();
}
});
// Render loadedPosts later
私がやりたいのは、投稿のuidフィールドに格納されているuidによってユーザーオブジェクトをクエリし、対応するloadedPostsオブジェクトにユーザーの名前フィールドを追加することです。一度に1つの投稿のみを読み込んでいた場合、これは問題ありません。クエリがオブジェクトとともに返されるのを待って、.then()
関数内でユーザードキュメントに対して別のクエリを作成します。
ただし、一度に複数の投稿ドキュメントを取得しているため.get()
、各投稿のuser/[uid]
ドキュメントを呼び出した後、正しいユーザーを正しい投稿にマップする方法を理解するのに苦労しています。
誰かがこの問題のエレガントな解決策を考えることができますか?
私は1ユーザーのdoc呼び出しと、必要なposts呼び出しを行います。
let users = {} ;
let loadedPosts = {};
db.collection('users').get().then((results) => {
results.forEach((doc) => {
users[doc.id] = doc.data();
});
posts = db.collection('posts').orderBy('timestamp', 'desc').limit(3);
posts.get().then((docSnaps) => {
docSnaps.forEach((doc) => {
loadedPosts[doc.id] = doc.data();
loadedPosts[doc.id].userName = users[doc.data().uid].name;
});
});
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加