首页 > 解决方案 > Swift + Firestore:如何获取相关对象

问题描述

我在 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",
             },
        }, ... 
    ]
}

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

因此,假设我们要从推文模型中删除 owner 字段,并保留 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?
}

标签: swiftfirebasegoogle-cloud-firestoreswift5.5

解决方案


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

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

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


推荐阅读