文档 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 作为键。
我正在尝试 运行 以下查询:
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 作为键。