使用 Codable 在 Swift 中包含子集合的 Firebase 文档
Firebase Documents with Sub-Collections in Swift using Codable
我想创建一个简单的 SwiftUI 应用程序,该应用程序使用 FireStore 并具有一个集合“recipes”和一个用于用户特定数据的集合“users”。在用户集合中,我想为每个用户添加一个文档,其中包含用户最喜欢的食谱的子集合。
在客户端,我对用户数据使用类似这样的东西:
import FirebaseFirestoreSwift
import Foundation
struct Account: Codable {
@DocumentID var id: String?
var favoriteRecipes = Set<Recipe>()
}
现在,如果我使用 Codable 支持将文档写入 firebase,它会为一组食谱创建一个 Map(我想这很好,我只是想用另一种方式)。
所以我显然可以“手动”处理子集合并像使用任何其他独立集合一样使用它。
尽管如此,我想知道在 Swift?
非常感谢!
你的问题分为两部分。让我尝试单独回答他们。
如何处理 Firestore / Codable 中的嵌套数据结构?
Codable
结构上的任何属性都将映射到 Firestore 文档上的相应属性(您可以通过使用 CodingKeys
枚举对此产生一些影响 - 请参阅 this article。
嵌套类型将映射到文档中的字典,而数组和其他序列将映射到文档中的数组。
为了检索文档的子集,您需要执行单独的提取请求。 Firestore 不支持在客户端获取 documents/sub-collections 的嵌套树。不过,在服务器上是另一回事。查看 Renaud's article 了解更多信息。
如何存储用户特定的数据?
对于任何特定于用户的数据,我建议使用以下两种方法之一来构建数据:
存储为子集合
在这种情况下,我们有一个顶级集合 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(来自 Firebase Auth)查询所有用户的食谱。
存储为顶级集合
在这种情况下,我们有 两个 顶级集合:一个用于所有用户,另一个用于 所有 食谱.为了区分用户的食谱,每个食谱文档都有一个uid
属性,其中包含相应用户的用户ID:
/(root)
+ users <-- (collection)
+ 0FABQ...RiGg <-- (user document)
- uid: "6ZPt...BLiK3fnl2" <-- (Firebase Auth user ID)
- name: "Johnny Appleseed" <-- (attribute)
+ FCED...12D5 <-- (another user document)
+ recipes (collection) <-- (collection)
+ A69EF...4EFA <-- (recipe document)
- uid: "6ZPt...BLiK3fnl2" <-- (Firebase Auth user ID)
- name: "Scones" <-- (attribute)
要检索用户的食谱,您可以查询所有食谱并筛选出与当前登录用户的用户 ID 匹配的食谱。
要了解有关 Firestore 数据建模的更多信息,请查看the documentation, which also contains links to a number of really useful videos. Fireship also has a really good article。
我想创建一个简单的 SwiftUI 应用程序,该应用程序使用 FireStore 并具有一个集合“recipes”和一个用于用户特定数据的集合“users”。在用户集合中,我想为每个用户添加一个文档,其中包含用户最喜欢的食谱的子集合。
在客户端,我对用户数据使用类似这样的东西:
import FirebaseFirestoreSwift
import Foundation
struct Account: Codable {
@DocumentID var id: String?
var favoriteRecipes = Set<Recipe>()
}
现在,如果我使用 Codable 支持将文档写入 firebase,它会为一组食谱创建一个 Map(我想这很好,我只是想用另一种方式)。
所以我显然可以“手动”处理子集合并像使用任何其他独立集合一样使用它。
尽管如此,我想知道在 Swift?
非常感谢!
你的问题分为两部分。让我尝试单独回答他们。
如何处理 Firestore / Codable 中的嵌套数据结构?
Codable
结构上的任何属性都将映射到 Firestore 文档上的相应属性(您可以通过使用 CodingKeys
枚举对此产生一些影响 - 请参阅 this article。
嵌套类型将映射到文档中的字典,而数组和其他序列将映射到文档中的数组。
为了检索文档的子集,您需要执行单独的提取请求。 Firestore 不支持在客户端获取 documents/sub-collections 的嵌套树。不过,在服务器上是另一回事。查看 Renaud's article 了解更多信息。
如何存储用户特定的数据?
对于任何特定于用户的数据,我建议使用以下两种方法之一来构建数据:
存储为子集合
在这种情况下,我们有一个顶级集合 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(来自 Firebase Auth)查询所有用户的食谱。
存储为顶级集合
在这种情况下,我们有 两个 顶级集合:一个用于所有用户,另一个用于 所有 食谱.为了区分用户的食谱,每个食谱文档都有一个uid
属性,其中包含相应用户的用户ID:
/(root)
+ users <-- (collection)
+ 0FABQ...RiGg <-- (user document)
- uid: "6ZPt...BLiK3fnl2" <-- (Firebase Auth user ID)
- name: "Johnny Appleseed" <-- (attribute)
+ FCED...12D5 <-- (another user document)
+ recipes (collection) <-- (collection)
+ A69EF...4EFA <-- (recipe document)
- uid: "6ZPt...BLiK3fnl2" <-- (Firebase Auth user ID)
- name: "Scones" <-- (attribute)
要检索用户的食谱,您可以查询所有食谱并筛选出与当前登录用户的用户 ID 匹配的食谱。
要了解有关 Firestore 数据建模的更多信息,请查看the documentation, which also contains links to a number of really useful videos. Fireship also has a really good article。