gpt4 book ai didi

firebase - 如何将复杂的 Firestore 查询卸载到 Firebase Cloud Functions 并在 iOS/Swift 客户端上解析结果?

转载 作者:行者123 更新时间:2023-12-05 07:03:25 25 4
gpt4 key购买 nike

<分区>

目前,我的客户端 (iOS/Swift) 正在通过过滤 whereField(...) 来获取文档,然后根据其他几个字段进一步过滤结果。这意味着一些对象被获取,然后被丢弃,浪费了宝贵的资源和带宽!

我可以在 firestore 云函数上执行这种复杂的过滤,而不是以某种方式将过滤后的结果解析到客户端上的同一个 firestore 对象中吗?明确地说,我知道如何编写云函数来获取和返回文件,我更感兴趣的是了解给客户的运输方式。

提供一些上下文的代码片段:

static func unmatchedChatsHelper(cursor: Any?, promise: @escaping (Result<UnmatchedChatsCursorResponse, Never>) -> Void) {
let earliestEventTime = Date()
// (1) Filtering done on backend.
var query = Firestore.firestore().collection("chats")
.whereField("eventTime", isGreaterThan: earliestEventTime)
.order(by: "eventTime")
.order(by: "createdAt", descending: true)
if let cursor = cursor as? DocumentSnapshot {
query = query.start(afterDocument: cursor)
}
query.getDocuments { (querySnapshot, error) in
guard let querySnapshot = querySnapshot else {
fatalError("Query snapshot failed: \(error?.localizedDescription ?? "no error")")
}
let transformedModels = querySnapshot.documents.compactMap { (chatQueryDocumentSnapshot) -> ChatModelFirebase? in
do {
return try chatQueryDocumentSnapshot.data(as: ChatModelFirebase.self)!
} catch let error {
logEvent(AnalyticsEventDidDropDocument, [
"document_id": chatQueryDocumentSnapshot.documentID
], error)
return nil
}
}
let me = Auth.auth().currentUser!.uid
// (2) Filtering done on client! This means some chats are retrieved unnecessarily.
let unmatchedChats = transformedModels.filter {
!$0.participants.contains(me)
&& $0.numParticipants < 6
&& !$0.declinedParticipants.contains(me)
&& $0.isDebug == DebugGating.isDebugBuild()
}
let cursor = querySnapshot.documents.last
promise(.success(UnmatchedChatsCursorResponse(models: unmatchedChats, cursor: cursor as Any)))
}
}

我有三个选择:

  1. [My Choice/Best Option] 同上,但使用 Firestore.Decoder 解析结果 ChatModelFirebase
  2. [解析逻辑是危险的] 在云函数上执行查询,返回 JSON,然后手动将结果解析到 ChatModelFirebase 中。
  3. [Too CoSTLy To Do] 更新我的 firestore 文档结构,以便通过 whereField(..) 完成所有查询,但这很复杂,因为 whereField 的选项有限。

还有什么我想念的吗?有更好的方法吗?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com