Firestore 集合组查询文档 ID

时间:2021-07-19 00:14:48

标签: firebase google-cloud-firestore angularfire

我正在尝试运行以下查询:

this.db.firestore
        .collectionGroup('members')
        .orderBy('dateModified', 'desc')
        .where(firebase.firestore.FieldPath.documentId(), '==', uid)

但我收到错误:

<块引用>

无效查询。查询集合组时 FieldPath.documentId(),提供的值必须产生一个有效的 文档路径,但 'X6yL5Ko55jSMWhhoQUO91xVYdEH3' 不是因为它 具有奇数个段 (1)。

是将文档ID 添加到文档的唯一方法吗? 这并不理想,因为我有很多现有数据...... 文档 ID 是 firebase 用户的 uid。

2 个答案:

答案 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 作为键。