我有一个具有以下结构的Cloud Firestore DB:
>用户
> [uid]
>帖子
> [id]
>内容:“只是一些测试帖.”
>时间戳:( 2017年12月22日)
> uid:[uid]
实际DB中存在更多数据,上面仅说明了集合/文档/字段结构.
我在我的网络应用程序中有一个视图,我正在显示帖子,并希望显示发布的用户的名称.我正在使用以下查询来获取帖子:
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
我想要做的是通过存储在post的uid字段中的uid查询用户对象,并将用户的name字段添加到相应的loadedPosts对象中.如果我一次只加载一个帖子就没有问题,只需等待查询返回一个对象,然后在.then()函数中再次查询用户文档,依此类推.
但是因为我一次收到多个帖子文档,因为异步,因此在每个帖子的用户/ [uid]文档上调用.get()之后,我很难弄清楚如何将正确的用户映射到正确的帖子他们回归的方式.
谁能想到这个问题的优雅解决方案?
解决方法
我会做1个用户doc调用和所需的帖子调用.
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; }); });