如何在 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以上是关于如何在 Cloud Firestore 中使用文档 ID 执行集合组查询的主要内容,如果未能解决你的问题,请参考以下文章
Firestore / Cloud功能 - 如何在更改时更新Firestore数据
Cloud Functions:如何将 Firestore 集合复制到新文档?
如何在 Cloud 函数中读取 Firestore 文档更新之前/之后的值?
即使文档中缺少请求的字段,如何安全地从 cloud-firestore 获取数据?