Firestore 对集合及其文档的子集合进行过滤

Posted

技术标签:

【中文标题】Firestore 对集合及其文档的子集合进行过滤【英文标题】:Firestore filtering on both collection and his documents' subcollection 【发布时间】:2021-08-11 15:10:41 【问题描述】:

是否可以在 Google Firestore 中查询一个集合,然后根据子集合值对其进行过滤?

我的意思是我得到了这个数据结构:

/
| repo/
| - title: title,
| - journal: Nyt,
| | category/
| | - name: News

我尝试用这种方式查询(例如检索 Nyt 分类新闻的所有文章):

db.collection('repo')
  .where('journal', '==', 'Nyt')
  .collection('category')
  .where('name', '==', 'News')

但是'Query' object has no attribute 'collection'.

我也尝试以这种方式构造数据:

/
| repo/
| - title: title,
| - journal: Nyt,
| - category: [
| | - news: News,
| | - tech: Tech,

然后通过 db.col('repo')....where('category.news', '==', 'News') 查询,但不幸的是我还需要 order_by 其他字段,因此 Firestore 要求为 db 中的每个类别建立索引...

【问题讨论】:

【参考方案1】:

这在 Firestore 中是不可能的。您一次只能过滤单个集合或子集合中的值。

您可能需要考虑将journal 的值复制到每个category 子集合的文档中,以便您可以使用collection group query 仅对子集合执行复合查询。

【讨论】:

不幸的是,我必须复制的不仅仅是子集合中唯一的“journal”属性...... 听起来您需要重组您的集合以支持您想要执行的查询。鉴于 Firestore 支持大规模可扩展数据集的方式,您现在所拥有的根本行不通。

以上是关于Firestore 对集合及其文档的子集合进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

FireStore 文档如何在子集合中读取计算

Firestore 安全规则 - 允许基于其父文档数据读取子集合

Firestore 查询文档的子集合

Firestore:获取带有和不带有子集合数据的集合[重复]

如何将子集合添加到 Firebase Cloud Firestore 中的文档

Firestore:如何同时收听集合和子集合