我正在尝试运行以下查询:
this.db.firestore
.collectionGroup('members')
.orderBy('dateModified', 'desc')
.where(firebase.firestore.FieldPath.documentId(), '==', uid)
但我收到错误:
<块引用>无效查询。查询集合组时 FieldPath.documentId(),提供的值必须产生一个有效的 文档路径,但 'X6yL5Ko55jSMWhhoQUO91xVYdEH3' 不是因为它 具有奇数个段 (1)。
是将文档ID 添加到文档的唯一方法吗? 这并不理想,因为我有很多现有数据...... 文档 ID 是 firebase 用户的 uid。
答案 0 :(得分:1)
正如错误消息所说,对于集合组上的索引,documentId()
字段值实际上存储为文档路径,以确保在索引中对这些值进行唯一查找。
如果您还想通过集合组查询文档 ID,则确实必须将 ID 作为字段值存储在每个文档中。
还要记住,这样就可以为查询获取多个文档,即使如果您使用内置的 add()
操作,这在天文数字上是不可能的。
答案 1 :(得分:0)
将 uid
添加到文档本身是目前唯一可行的方法,然后对该字段进行查询:
this.db.firestore
.collectionGroup('members')
.orderBy('dateModified', 'desc')
.where("uid", '==', uid)
有一个 Github issue 表示相同,并解释了为什么这是不可能的。
这就是为什么我有时更喜欢存储根级集合成员的原因。集合中的每个文档都将包含 groupID
(或任何您的父集合的用途)。如果您使用用户 ID 作为其中文档的键,那么事情就变得简单了。
this.db.firestore.collection("members").doc(uid)
因此,结构将类似于:/groups/{groupID}/members/{memberID}
,而不是像:/groups/{groupID}
这样的路径,并且所有成员都将存储在根级别集合“成员”中。该集合中的文档可能如下所示:
// uid as doc key
{
groupId: "groupID",
...otherFields
}
问题是,如果一个成员可以加入多个组,则不能使用 userId 作为键。