使用CODATABLE在Swift中包含子集合的Firebase文档

使用CODATABLE在Swift中包含子集合的Firebase文档,swift,firebase,google-cloud-firestore,swiftui,codable,Swift,Firebase,Google Cloud Firestore,Swiftui,Codable,我想创建一个简单的SwiftUI应用程序,它使用FireStore,并有一个“配方”集合和一个针对用户特定数据的“用户”集合。在users集合中,我想为每个用户添加一个文档,其中包含一个子集合,其中包含用户最喜欢的食谱 在客户端,我对用户数据使用了如下内容: import FirebaseFirestoreSwift import Foundation struct Account: Codable { @DocumentID var id: String? var favor

我想创建一个简单的SwiftUI应用程序,它使用FireStore,并有一个“配方”集合和一个针对用户特定数据的“用户”集合。在users集合中,我想为每个用户添加一个文档,其中包含一个子集合,其中包含用户最喜欢的食谱

在客户端,我对用户数据使用了如下内容:

import FirebaseFirestoreSwift
import Foundation

struct Account: Codable {
    @DocumentID var id: String?
    var favoriteRecipes = Set<Recipe>()
}
导入FirebaseFirestoreSwift
进口基金会
结构帐户:可编码{
@DocumentID变量id:String?
var favoritecipes=Set()
}
现在,如果我使用Codable支持将文档写入firebase,它将为一组配方创建一个映射(我想这很好,我只是想用另一种方式)

因此,我显然可以“手动”处理子集合,并像其他独立集合一样使用它

然而,我想知道是否有某种“最佳实践”可以在Firebase中使用Swift中的Codable处理子集合?


非常感谢

你的问题有两个部分。让我试着逐一回答

如何处理Firestore/Codable中的嵌套数据结构?
Codable
结构上的任何属性都将映射到Firestore文档上的相应属性(通过使用
CodingKeys
enum,您可以对其产生一些影响-请参阅)

嵌套类型将映射到文档上的字典,而数组和其他序列将映射到文档上的数组

/(root)
  + users                         <-- (collection)
    + 0FABQ...RiGg                <-- (user document)
      - uid: "6ZPt...BLiK3fnl2"   <-- (Firebase Auth user ID)
      - name: "Johnny Appleseed"  <-- (attribute)
      + recipes (collection)      <-- (sub-collection)
        + A69EF...4EFA            <-- (recipe document)
          - name: "Scones"        <-- (attribute)
    + FCED...12D5                 <-- (another user document)
为了检索文档的子集合,您需要执行单独的获取请求。Firestore不支持在客户端获取文档/子集合的嵌套树。不过,服务器上的情况不同。请查看以了解更多信息

如何存储特定于用户的数据? 对于任何用户=特定数据,我建议使用以下两种方法之一来构造数据:

作为子集合存储 在此场景中,我们有一个顶级集合
users
,其中包含所有用户的文档(让Firestore自动为您生成文档ID,并将Firebase Auth的用户ID作为属性存储在相应的
user
文档中)

/(root)
  + users                         <-- (collection)
    + 0FABQ...RiGg                <-- (user document)
      - uid: "6ZPt...BLiK3fnl2"   <-- (Firebase Auth user ID)
      - name: "Johnny Appleseed"  <-- (attribute)
      + recipes (collection)      <-- (sub-collection)
        + A69EF...4EFA            <-- (recipe document)
          - name: "Scones"        <-- (attribute)
    + FCED...12D5                 <-- (another user document)
要检索用户的配方,请查询所有配方并筛选与当前登录用户的用户ID匹配的配方


要了解有关Firestore数据建模的更多信息,请访问,其中还包含许多非常有用的视频的链接。Fireship对此也有自己的看法。

问题相当模糊-代码希望您以另一种方式进行建模,您希望以什么其他方式进行建模?处理子集合的最佳实践将取决于其含义按句柄。用例是什么?或者您希望运行的查询是什么?您能否提供一些代码示例,这些代码无法按预期工作?非常感谢。我没有说明您无法查询包含所有子集合的文档,因此firebase存储对其他“模型”的引用是完全有意义的作为地图,而不是任何形式的子集合。不过有一件事:如果我想包含配方(或配方的一部分)的数据在上面我的代码示例中发生的映射中的帐户文档中,如何告诉firestore也存储ID?截至目前,firestore未将配方ID包含在配方映射中(ID用
@DocumentID
包装)