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。
正如错误消息所述,对于集合组上的索引,documentId()字段值实际上存储为文档路径,以确保索引中这些值的唯一查找。
如果您还想通过集合组查询文档 ID,则确实必须将 ID 作为字段值存储在每个文档中。
另请记住,这样就可以为查询获取多个文档,尽管如果使用内置add()操作,这种可能性在天文数字上是不可能的。
将 添加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 作为密钥。
| 归档时间: |
|
| 查看次数: |
5141 次 |
| 最近记录: |