我的 Ionic 5 应用程序中有以下 Firestore 数据库结构。
- 书籍(集合)
- {bookID}(包含书籍字段的文档)
- 喜欢(子集合)
- {userID}(文档名称为带有字段的用户 ID)
- 喜欢(子集合)
- {bookID}(包含书籍字段的文档)
Book
集合包含文档,每个文档都有一个 Like
子集合。 Like集合的文档名称是喜欢该书的用户ID。
我正在尝试执行查询以获取最新的书籍
,同时尝试从Like
子集合中获取文档以检查我是否喜欢它。
async getBook(coll) {
snap = await this.afs.collection('Book').ref
.orderBy('createdDate', "desc")
.limit(10).get();
snap.docs.map(x => {
const data = x.data();
coll.push({
key: x.id,
data: data.data(),
like: this.getMyReaction(x.id)
});
}
async getMyReaction(key) {
const res = await this.afs.doc('Book/myUserID').ref.get();
if(res.exists) {
return res.data();
} else {
return 'notFound';
}
}
我在这里所做的是使用每个图书 ID 调用方法 getMyReaction()
并将 promise 存储在 like
字段中。后来,我在 HTML 中使用 async
管道读取 like
值。这段代码工作正常,但获取 like
值有一点延迟,因为 promise 需要时间才能得到解决。有没有办法在获取收藏值的同时获取子收藏值?
最佳答案
Is there a solution to get sub-collection value at the same time I am getting the collection value?
如果不重组您的数据,就不可能。 Firestore 查询只能考虑单个集合中的文档。唯一的异常(exception)是集合组查询,它允许您考虑具有完全相同名称的所有集合中的文档。您现在正在做的“加入”这两个集合的操作可能与您将获得的效果差不多。
将其转换为单个查询的唯一方法是使用另一个集合,其中的数据预先从其他两个集合中合并。这实际上在 nosql 数据库上很常见,被称为非规范化。但这完全取决于您来决定这是否适合您的用例。
关于angularjs - 将 Firestore 集合和子集合文档数据放在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63692347/