【问题标题】:Swift + Firestore: How to fetch related objectsSwift + Firestore:如何获取相关对象
【发布时间】:2021-12-15 09:09:20
【问题描述】:

我在 Swift 中有这个模型

import SwiftUI
import FirebaseFirestoreSwift
import FirebaseFirestore

struct Tweet: Codable, Identifiable, Hashable {
        
    var id: UUID = UUID()
    var content: String
    var ownerId: String
    var owner: UserProfile
    var likes: Int
    @ServerTimestamp var createdAt: Timestamp?
}

它存储在 Firestore 集合“推文”中:

tweets: {
    [
        "ds4a65d4a65sd46das65d4": {
            "content" : "safsafds",
            "createdAt" : "...",
            "id" : "sdfsdfsd",
            "likes" : 0,
            "ownerId" : "123",
            "owner" : {
                 "bio": "aaasdasdassa",
                 "username": "asdasd",
                 "profileImage": "aaa",
                 "userId": "123",
             },
        }, ... 
    ]
}

当我获取所有推文时,我会正常获取信息以及所有者数据。但所有者数据可能是旧的。假设用户更改了他的个人资料图片或用户名...等,因此推文所有者数据可能不是最新的。

所以,假设我们要从推文模型中移除 ow​​ner 字段,并保留 ownerId。

如何使用以下模型获取所有带有所有者数据的推文?

struct Tweet: Codable, Identifiable, Hashable {
        
    var id: UUID = UUID()
    var content: String
    var ownerId: String
    // var owner: UserProfile   <-- THIS IS REMOVED
    var likes: Int
    @ServerTimestamp var createdAt: Timestamp?
}

【问题讨论】:

  • 这听起来不像是您可以在 fetch 调用中动态执行的操作。听起来您实际上需要在服务器上重构数据。

标签: swift firebase google-cloud-firestore swift5.5


【解决方案1】:

我相信您想要实现的是更新推文集合中的所有者数据。因此,您正在尝试同时查询您的推文集合和引用的所有者集合。这涉及更新/重组服务器端的数据。这是不可行的。

Firestore 没有跨集合的服务器端连接或投影的概念。每个查询或文档读取只能从单个集合中获取数据,或者从与集合组查询具有相同名称的所有集合中获取数据。如果您需要从两个集合中加载数据,则至少需要两次读取。

您也可以参考类似的Stack Overflow案例。

【讨论】:

  • 这不是回答问题。
  • 请找到上面更新的答案。
猜你喜欢
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 2018-11-12
  • 1970-01-01
  • 2018-08-12
  • 1970-01-01
相关资源
最近更新 更多