javascript - 如何从具有相关字段的 Firestore 加载多个集合?
问题描述
假设我有 2 个模型。
- 邮政
- 作者
作者如下图:
{
authorId: 'ghr4334t',
fullName: 'This is a post!'
Nickname: 'Avola
}
帖子如下所示,并且将引用作者,如下所示:
{
postId: '12fdc24',
authorId: 'ghr4334t',
content: 'This is a post!'
}
目前,当用户点击帖子时,为了显示所有相关信息,我加载数据如下:
getPost(postId).then(post=> {
getAuthor(listing.uid).then((document) => {
// update state so I have the post object and author object.
})
})
所以上面,我加载帖子,然后加载作者。一旦我加载了它们,我终于可以构造一个自定义对象:
const finalPost = {
author: { ...this.state.authorData },
post: { ...this.state.postData }
}
自然地..如果我有更多引用其他集合的字段,则会有一个嵌套get
和.then()
调用,如下所示:
getPost(postId).then(post=> {
getAuthor(listing.uid).then((document) => {
getSomethingElse(listing.uid).then((document) => {
getAnother(listing.uid).then((document) => {
// finally update state with everything.
})
})
})
})
是否有更好的方法可以将相关信息一起加载而无需堆栈.then()
调用?
解决方案
不幸的是,没有更好的方法可以直接使用查询来实现您想要的。Firestore 中的查询并没有为您提供很多关于如何查询和返回数据的选项,主要是当您需要对JOIN
它们执行任何类型的操作时,通过引用进行搜索,这使得工作变得不那么容易。我相信您正在做的方式是您现在拥有的最佳选择。
您可以尝试的另一种选择是使用Subcollections,您将在其中拥有一个Author
子集合Post
。这样,您将只处理 的引用Post
,因为Author
将在每个特定的文档中Post
。这样,查询会更简单,如下所示。当然,这需要您修改数据库。
var messageRef = db.collection('Post').doc('Post1')
.collection('Author').doc('Author1');
如果您仍然认为这还不够,我建议您在Google 的系统上提出功能请求, Google 开发人员将能够检查是否有可能实施一种获取数据的新方法。
让我知道这些信息是否澄清了您的疑问!
推荐阅读
- r - predict.drc 的帮助页面中可能存在错误
- python - 第二次出现任何数字后拆分字符串?
- php - 在 Airflow 工作者中执行 PHP 脚本
- delphi - 直接从 Embarcadero Delphi 使用 OS X API
- javascript - React Native iOS - 在 Podfile 中启用 Hermes,但在应用程序中未启用
- winhttp - 为整个 WinHttp 请求设置总体超时
- r - 将列表中的五个项目添加到数据框列中的每个值
- vba - MS Word VBA 查找可变长度模式字符串
- javascript - 使用 vuex-persistedstate 时的只读问题
- image-processing - 如何判断一张人脸图片是否具有纯色背景,人脸和背景之间的对比度很高?