swift - 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?
}
解决方案
我相信您想要实现的是更新推文集合中的所有者数据。因此,您正在尝试同时查询您的推文集合和引用的所有者集合。这涉及更新/重组服务器端的数据。这是不可行的。
Firestore 没有跨集合的服务器端连接或投影的概念。每个查询或文档读取只能从单个集合中获取数据,或者从与集合组查询具有相同名称的所有集合中获取数据。如果您需要从两个集合中加载数据,则至少需要两次读取。
您也可以参考类似的Stack Overflow案例。
推荐阅读
- c++ - 对的排序向量 (std::vector
>) 按pair的第一个元素搜索并更新第二个元素值 - java - 如何设置列表的最大大小
- javascript - 需要使用 selenium python [webRTC] 从 RTCPeerConnection.getStats() 捕获数据
- python - 如何杀死超过 Linux 中 CPU 使用率和运行时限制的特定进程?
- android - 如何从原生Android端动画化FlutterActivity(flutter screen)的退出过渡?
- arrays - Java方法返回空白数组
- javascript - JavaScript 自动页面重新加载
- css - Vue关闭模态过渡样式未触发
- azure - 无法从 Azure Kubernetes 服务连接到 Azure SQL DB 服务器
- python - Python - 如何编写一个循环来根据另一个列表的元素 python 为列表中的每个 df 添加一列