firebase - 如何将复杂的 Firestore 查询卸载到 Firebase Cloud F


想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它.

关闭 2 年前

Improve this question

目前,我的客户端 (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 的选项有限。

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

相关文章:

php - 使用 Laravel 的 Eloquent 将数据发送到数据库的问题

laravel - 如何在 Laravel 中显示带有法语符号的验证消息?

java - 使用 Spring WebClient 重复过滤响应

python - 如何使用 Elasticsearch-dsl 在 Django 中进行并行测试?

reactjs - react : Fix missing dependency warning u

android - 使用 Jetpack Navigation 在深度链接 URI 中使用字符串常量

angular - 在 Angular 10 中将 HTML 转换为 PDF

reactjs - 在 Jest 中测试 Axios

python-3.x - 无论如何,您是否可以检查 Azure CLI 在后台执行哪些 API 调用

python - Django 信号卡在循环中