Firestore集合组查询文档ID

Mad*_*Mac 6 firebase angularfire google-cloud-firestore

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

this.db.firestore
        .collectionGroup('members')
        .orderBy('dateModified', 'desc')
        .where(firebase.firestore.FieldPath.documentId(), '==', uid)
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

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

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

Fra*_*len 8

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

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

另请记住,这样就可以为查询获取多个文档,尽管如果使用内置add()操作,这种可能性在天文数字上是不可能的。


Dha*_*raj 6

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

this.db.firestore
        .collectionGroup('members')
        .orderBy('dateModified', 'desc')
        .where("uid", '==', uid)
Run Code Online (Sandbox Code Playgroud)

Github上有一个同样的问题,并解释了为什么这是不可能的。

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

this.db.firestore.collection("members").doc(uid)
Run Code Online (Sandbox Code Playgroud)

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

// uid as doc key
{
  groupId: "groupID", 
  ...otherFields
}
Run Code Online (Sandbox Code Playgroud)

问题是如果一个成员可以加入多个组,则不能使用 userId 作为密钥。

  • 啊,这很烦人,因为在设计数据模型之前我没有意识到这个限制。幸运的是,它适用于用户,我将电子邮件存储在文档中,这样我就可以使用它而不是 uid/documentId。 (2认同)