Firestore CollectionGroup查询返回空结果

时间:2019-06-14 08:25:19

标签: ios swift firebase google-cloud-firestore

我的Firestore数据库当前设置如下: Database

组有成员(用户列表),我想查询并找到所有特定用户的组。我发现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
    })

我遵循了文档并在数据库中添加了索引: enter image description here

并更新了安全规则(应用尚未公开,因此该规则仅是占位符)。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  match /{document=**} {
      allow read, write;
  }
  match /{path=**}/members/{doc} {
      allow read, write;
  }
  }
}

当数据库明显具有一个成员与用户ID匹配的组时,需要帮助理解为什么(并修复)查询总是返回空结果。

2 个答案:

答案 0 :(得分:2)

  

当数据库中的组明显具有一个具有匹配用户ID的成员时,查询总是返回空结果。

之所以会这样,是因为member是文档中的属性,而不是子集合。

根据有关collection group queries in Firestore的官方文档:

  

一个集合组由具有相同ID的所有集合组成。默认情况下,查询从数据库中的单个集合检索结果。使用集合组查询可从集合组而不是单个集合中检索文档。

因此,如果要使用集合组查询,则需要将member属性更改为子集合,应在其中添加member对象,然后查询才能工作。

在使用收集组查询之前,也请不要忘记创建一个支持您的收集组查询的索引。

答案 1 :(得分:0)

不要将成员作为地图类型放在字段中,而是放在集合中。

然后您会在控制台中看到一个错误,其中包含用于创建所需索引的链接,如下所示:

  

该查询需要COLLECTION_GROUP_ASC索引才能进行收集   成员和字段ID。您可以在这里创建它:   https://console.firebase.google ...

请稍等片刻,使新索引生效。