我的Firestore是这样组织的:
├── posts/
│ ├── post1/
│ │ ├── comment1
│ │ ├── comment2
│ │ ├── ...
│ ├── post2/
│ │ ├── comment1
│ │ ├── comment2
│ │ ├── comment3
│ │ ├── ...
│ ├── ...
是否有一种方法,例如,让我查询最近的帖子,对于这些帖子的每个,获得最近的评论,都在一次?(即不存储post查询,然后创建本地的for-each查询;获取各自的评论)
理想情况下,我甚至想超越这一点:我也想获得帖子本身,所有这些都是一次性的。这对于创建一个包含整个应用程序活动摘要的视图非常有用,例如
我有感觉,这是不可能与Firestore虽然。据我所知,它们遵循的策略是不将同一查询中不同级别/(子)集合上的文档混合在一起。
我现在正在使用Dart,但我想这个问题有点语言不可知论。我想象这样的查询是这样的形状:
ref
.collection('posts')
.orderBy('date')
.forEach()
.collection('comments')
.orderBy('date');
Firestore只能返回来自单个集合的文档,或者所有具有相同名称的集合。同样,它只能过滤它返回的文档中已知字段中存在的数据。
因此,如果评论在每个帖子下的子集合中,则需要运行单独的查询来获取它们。
一个常见的解决方法是将N个最近的评论存储在post文档本身中,而不是存储在子集合中。这样一来,写操作就会变得复杂一些,但它可以让您更有效地读取所需的数据。
在处理NoSQL数据库时,这种类型的数据重复是非常常见的,这也是它们在读操作上伸缩性如此之好的原因之一。要了解更多关于这种权衡的知识,我建议阅读NoSQL数据建模并观看了解Cloud Firestore。