文档 ID 上的 Firestore 集合组查询

Firestore collection group query on document id

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

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

但是我得到错误:

Invalid query. When querying a collection group by FieldPath.documentId(), the value provided must result in a valid document path, but 'X6yL5Ko55jSMWhhoQUO91xVYdEH3' is not because it has an odd number of segments (1).

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

如错误消息所述,对于集合组上的索引,documentId() 字段值实际上存储为文档路径以确保在索引中唯一查找这些值。

如果您还想通过集合组查询文档 ID,您确实必须将 ID 作为字段值存储在每个文档中。

另外请记住,如果您使用内置的 add() 操作,那么可能会为查询获取多个文档,即使这在天文数字上是不可能的。

uid 添加到文档本身是目前唯一可能的方法,然后在该字段上查询:

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

同样有一个 Github issue 并解释了为什么那是不可能的。

这就是为什么我有时更喜欢存储根级集合成员的原因。集合中的每个文档都将包含 groupID (或您的父集合的任何含义)。如果您使用 userID 作为其中文档的密钥,那么它就很容易了。

this.db.firestore.collection("members").doc(uid)

因此,路径不会像:/groups/{groupID}/members/{memberID},结构会像:/groups/{groupID},所有成员都将存储在根级别集合 'members' 中。该集合中的文档可能如下所示:

// uid as doc key
{
  groupId: "groupID", 
  ...otherFields
}

要注意的是,如果一个成员可以加入多个组,则不能使用 userId 作为键。