gpt4 book ai didi

javascript - 如何在 Cloud Firestore 查询中加入多个文档?

转载 作者:可可西里 更新时间:2023-11-01 01:48:40 25 4
gpt4 key购买 nike

我有一个具有以下结构的 Cloud Firestore 数据库:

  • 用户
    • [uid]
      • 姓名:“测试用户”
  • 帖子
    • [id]
      • 内容:“只是一些测试帖子。”
      • 时间戳:(2017 年 12 月 22 日)
      • uid: [uid]

实际DB中的数据较多,以上只是集合/文档/字段结构的说明。

我在我的网络应用程序中有一个 View ,我在其中显示帖子并希望显示发帖用户的姓名。我正在使用以下查询来获取帖子:

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对象中。如果我一次只加载一篇文章,这没问题,只需等待查询返回一个对象,然后在 .then() 函数中对用户文档进行另一个查询,等等。

但是,因为我一次获得多个帖子文档,所以在对每个帖子调用 .get() 后,我很难弄清楚如何将正确的用户映射到正确的帖子user/[uid] 文档,因为它们以异步方式返回。

谁能想出一个优雅的解决方案来解决这个问题?

最佳答案

这对我来说似乎相当简单:

let loadedPosts = {};
posts = db.collection('posts')
.orderBy('timestamp', 'desc')
.limit(3);
posts.get()
.then((docSnaps) => {
docSnaps.forEach((doc) => {
loadedPosts[doc.id] = doc.data();
db.collection('users').child(doc.data().uid).get().then((userDoc) => {
loadedPosts[doc.id].userName = userDoc.data().name;
});
})
});

如果你想防止多次加载用户,你可以缓存用户数据客户端。在那种情况下,我建议将用户加载代码分解为辅助函数。但这将是上述内容的变体。

关于javascript - 如何在 Cloud Firestore 查询中加入多个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47947659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com