如何在 Cloud Firestore 中使用文档 ID 执行集合组查询

Posted

技术标签:

【中文标题】如何在 Cloud Firestore 中使用文档 ID 执行集合组查询【英文标题】:How to perform collection group query using document ID in Cloud Firestore 【发布时间】:2019-10-04 21:28:03 【问题描述】:

几天前,我将我的应用程序帖子从实时数据库移到了云 Firestore,因为 Firestore 显然具有更灵活的查询。我一直在修改我的代码以使用 firestore 作为新数据库。现在我遇到了一个问题。如何检索“帖子”集合中的每个文档,这些文档具有包含特定命名文档的“喜欢”集合?我不知道这是否有意义,所以这里有一张展示问题的图片:

我对 firebase 实时数据库进行了有效查询,但不知道如何使用 firestore 进行查询。有可能还是我必须更改数据库的结构?如果我必须改变结构,获得相同结果的最方便的方法是什么?

【问题讨论】:

有非常清晰的文档供查询。你必须搜索here 是的,我确实阅读了我能找到的所有内容,但没有弄明白。 @AapoVainonen “包含特定命名的文档”是什么意思? Likes 集合中的 doc 具有特定的字段值?特定的文档 ID? 我的意思是例如如何检索特定用户喜欢的每个帖子。所以在这个例子中检查“喜欢”集合是否包含我们想要查看喜欢的帖子的用户用户 ID。抱歉,如果这没有意义,英语不是我的母语。 因此在文档yQ6m2...(在Likes 集合中)有一个名为例如liker 的字段,您想搜索该字段具有特定值的文档。对吗? 【参考方案1】:

目前这对于集合组查询是不可能的。您可能很想对FieldPath.documentId() == 'your-doucment-id' 的查询进行过滤,但这不被支持。 FieldPath.documentId()其实是一个token,指的是完全唯一的文档id,包含了文档的整个路径。

解决方法是将文档 ID 作为字段存储在文档中,然后过滤该字段的内容。因此,如果文档有一个名为 id 的字段,其中包含文档的 ID,则可以查询 collectionGroup("Likes").whereEquals('id', 'your-document-id')

【讨论】:

我找不到collectionGroup之类的东西? @AapoVainonen 访问firebase.google.com/docs/firestore/query-data/… 并向下滚动到该部分的第二个代码块。但我认为在这种情况下将 Likes 存储为单独的表可能会更好(与 Posts 处于同一级别)并执行 collection('Likes').doc(LIKE_ID)。 .where(FieldPath.documentId, whereIn: idList) 仅适用于collection,不适用于collectionGroup。还要记住,使用这种方法的列表是limited to 10 values。 大多数答案是“抱歉,它在 Firestore 中是不可能的” 我尝试使用该解决方法。我得到“'CollectionGroup'.ts(2339) 类型上不存在属性 'whereEquals'”。也许应该是,"db.collectionGroup("Cart").where('id','==', id).get()"

以上是关于如何在 Cloud Firestore 中使用文档 ID 执行集合组查询的主要内容,如果未能解决你的问题,请参考以下文章

Firestore / Cloud功能 - 如何在更改时更新Firestore数据

Cloud Functions:如何将 Firestore 集合复制到新文档?

如何在 Cloud 函数中读取 Firestore 文档更新之前/之后的值?

即使文档中缺少请求的字段,如何安全地从 cloud-firestore 获取数据?

如何在 Cloud Firestore 查询中加入多个文档?

如何从Swift中的Cloud FireStore Firebase访问特定字段