【发布时间】:2021-03-26 14:30:27
【问题描述】:
我是 firebase 新手,但我有一个 users 集合,其中每个用户文档都有以下字段
username-
avatar(头像) name
每个用户都可以发表评论,评论将存储在带有这些字段的 comments 集合中
-
createdAt -
username(评论的用户) -
userAvatar(用户头像)
在检索 cmets 时,我可以将每条评论与评论的用户 (username) 和 userAvatar 一起显示。虽然每个评论都有静态的username 和userAvatar 字段,但问题是如果我要在用户文档中更改用户的头像,我也想修改相关评论文档中的 userAvatar 以获得更多的数据一致性。
为了实现这一点,我考虑创建一个云函数触发器来收听用户的avatar 更新,以相应地更改评论userAvatar。但我很快意识到这在成本方面是一个糟糕的举措,因为每次用户文档内部发生更改时都会触发云功能,无论它是否是 avatar 更改。
所以我决定在评论文档中创建一个用户引用,因为它就像 SQL 数据库中的引用键一样工作
createdAtuser: db.doc('users/' + firebase.auth().currentUser.uid)
现在的主要问题是,如果我想从数据库中检索 15 个 cmets,对于每条评论,我们还必须获取用户信息。所以我们会有这样的东西
exports.getComments = async (req, res) => {
try {
let comments = [];
const data = await db
.collection("comments")
.orderBy("createdAt", "desc")
.get();
data.forEach((doc) => {
let comment = doc.data();
doc.data().user
.get()
.then(element => {
comment.avatar = element.data().avatar;
comment.username = element.data().username;
comments.push(comment);
})
.catch(e => console.log(e));
});
return res.json(comments);
} catch (e) {
console.log(e);
return res.status(500).json({ e });
}
};
现在我想知道如果我有 1000 cmets 会怎样?在延迟方面,该应用不会提供良好的用户体验。不能同时从用户和评论集合中检索数据吗?
【问题讨论】:
-
问题:如果我今天是罗伯特,我发表评论,明天改名为 Freddie - 谁发表评论?罗伯特还是弗雷迪?
-
@RobertKawecki 您可以将您的姓名更改为。因为如果您更改用户信息,评论只会使用用户参考,因此评论也会发生变化。但是我会让更改用户名变得困难。用户名将是电子邮件或文档 ID 的附加标识符
标签: node.js firebase google-cloud-firestore