组有成员(用户列表),我想查询并找到所有特定用户的组。我发现collectionGroup查询应该是解决方案,这是我的查询代码。
let db = Firestore.firestore()
let ref = db.collectionGroup("members").whereField("id", isEqualTo: userID)
ref.getDocuments(completion: { (snapshot, error) in
guard let snapshot = snapshot else { return }
print(snapshot.documents.count) --> Always 0
})
并更新了安全规则(应用尚未公开,因此该规则仅是占位符)。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write;
}
match /{path=**}/members/{doc} {
allow read, write;
}
}
}
当数据库明显具有一个成员与用户ID匹配的组时,需要帮助理解为什么(并修复)查询总是返回空结果。
答案 0 :(得分:2)
当数据库中的组明显具有一个具有匹配用户ID的成员时,查询总是返回空结果。
之所以会这样,是因为member
是文档中的属性,而不是子集合。
根据有关collection group queries in Firestore的官方文档:
一个集合组由具有相同ID的所有集合组成。默认情况下,查询从数据库中的单个集合检索结果。使用集合组查询可从集合组而不是单个集合中检索文档。
因此,如果要使用集合组查询,则需要将member
属性更改为子集合,应在其中添加member
对象,然后查询才能工作。
在使用收集组查询之前,也请不要忘记创建一个支持您的收集组查询的索引。
答案 1 :(得分:0)
不要将成员作为地图类型放在字段中,而是放在集合中。
然后您会在控制台中看到一个错误,其中包含用于创建所需索引的链接,如下所示:
该查询需要COLLECTION_GROUP_ASC索引才能进行收集 成员和字段ID。您可以在这里创建它: https://console.firebase.google ...
请稍等片刻,使新索引生效。