javascript - 如何从 Firestore 中的多层文档中获取字段
问题描述
我正在通过 React 和 Firebase 创建一个类似 Reddit 的网站,这是我的数据结构:
组 - 随机 uid - 讨论 - 随机 uid - subdiscussion-first - random-uid - subdiscussion - 第二 - random-uid ......等等。
我已经编写了代码来创建这样的结构。
try {
await FirebasePack
.firestore()
.collection('groups')
.where('name', '==', group)
.get()
.then((querySnapshot) => {
querySnapshot.forEach((doc) => {
doc.ref.collection('discussions').doc().set({
title: title,
content: content,
creator: creator,
rating: 0,
subdiscussions: 0,
created_time: firebase.firestore.FieldValue.serverTimestamp()
});
});
});
} catch (error) {
console.log(error);
}
setPageLoading(false);
};
我的问题是,当我要展示这样的东西时:
解决方案
为每个嵌套回复创建子集合可能不是最好的方法,因为您的最大深度限制为 100个子集合。您可以创建一个子集合"messages"
并将所有消息存储在其中。结构将是这样的:
groups -> {groupId} -> messages -> {messageId}
(col) (doc) (col) (doc)
每个文档(消息)的结构可以是这样的:
{
id: "msgID",
author: "msg_author_id",
replyTo: "GROUP_or_msgID",
...otherFields
}
在这里,每条消息都有一个字段replyTo
,可以是它正在回复的消息的 ID,也可以是“GROUP”。如果replyTo
是“GROUP”,则表示它是组中的直接消息,如果是 ID,则表示回复。
如何对这些消息进行分页完全取决于您的应用程序流程,即在开始时加载一些消息,如果用户请求则加载更多消息。例如,如果用户想要加载对 ID 为 1234 的消息的回复,您可以运行以下查询:
const msgRef = firebase.firestore().collection("groups").doc(groupID).collection("messages")
const replies = await msgRef.where("replyTo", "==", "1234").get()
console.log(replies.docs.map(reply => ({id: reply.id, ...reply.data()})))
推荐阅读
- global-variables - 在 Katalon Studio 中,如何将元素值存储在 Web 服务响应的全局变量中,并且需要传入另一个 Web 服务请求或标头
- azure - 使用服务主体对 Azure Data Lake Storage Gen 2 进行 REST API 调用的 OAuth 令牌
- flutter - 发送带有附件的电子邮件 Flutter(IOS)
- json - 如何将 Json 输出分配给 Key 变量
- python - 如何解析两个三维数组“fid,fi-> fd”的numpy.einsum
- apache - SVN 日志文件命令
- python - 在 pandas 列中搜索字符串列表
- visual-studio - 如何复制或拆分 SSAS 项目或数据源视图
- c# - c# wpf在运行时编辑按钮
- docker - docker 应用程序的 IP 地址