【问题标题】:Firestore collectionGroup query returns empty resultFirestore 集合组查询返回空结果
【发布时间】:2019-10-28 20:40:36
【问题描述】:

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

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

【问题讨论】:

  • 请再次参考文档,collectionGroup 的用例与您尝试实现的方式不同。顾名思义,它查询 ref 应该有“集合”分组

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

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

发生这种情况是因为member 是您文档中的一个属性,而不是子集合。

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

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

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

在使用集合组查询之前,别忘了创建一个支持您的集合组查询的索引。

【讨论】:

  • 嗨克拉拉梅隆!我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我会很感激的。谢谢!
【解决方案2】:

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

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

查询需要一个 COLLECTION_GROUP_ASC 索引来收集 成员和字段 ID。你可以在这里创建它: https://console.firebase.google...

在新索引生效之前给它一点时间。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 2021-11-20
    相关资源
    最近更新 更多