【问题标题】:How to merge two queries using Firestore - Swift如何使用 Firestore 合并两个查询 - Swift
【发布时间】:2021-01-12 17:13:39
【问题描述】:

我需要将两个查询与 firebase firestore 合并,然后使用文档的 timestamp 字段对结果进行排序。 在网上我没有找到太多关于 Swift 和 Firestore 的信息。 这是我到目前为止所做的:

db.collection("Notes").whereField("fromUid", isEqualTo: currentUserUid as Any).whereField("toUid", isEqualTo: chatUserUid as Any).getDocuments { (snapshot, error) in
        if let error = error {
            print(error.localizedDescription)
            return
        }
        db.collection("Notes").whereField("fromUid", isEqualTo: self.chatUserUid as Any).whereField("toUid", isEqualTo: self.currentUserUid as Any).getDocuments { (snaphot1, error1) in
            if let err = error1{
                print(err.localizedDescription)
                return
            }
        }
    }

我在第一个查询 on completion 中添加了第二个查询,但现在我不知道如何合并它们并通过 timestamp 的字段对它们进行排序。

关于这个有见地的question 解释说建议使用Task对象,但我没有找到与swift类似的东西。

【问题讨论】:

  • 可能不需要合并数据,但问题很不清楚 - 嵌套查询似乎与顶层没有任何关系,除了它会在第一个查询之后发生在它的快照中返回数据。但是,您没有对这些数据做任何事情。您能否包括您的 Firestore 结构并说明查询应该做什么以及最终结果应该是什么
  • 我需要获取与“fromUid”和“toUid”对应的所有文档,然后还需要获取与uids相反的所有文档。之后,我将对检索到的所有数据进行分组,并按时间戳对它们进行排序

标签: swift firebase google-cloud-firestore


【解决方案1】:

有很多方法可以做到这一点;这是一种选择。

为了提供答案,我们必须做一些补充;首先,我们需要在某个地方存储从 firebase 检索到的数据,所以这里有一个包含一些聊天信息的类

class ChatClass {
    var from = ""
    var to = ""
    var msg = ""
    var timestamp = 0

    convenience init(withDoc: DocumentSnapshot) {
        self.init()
        self.from = withDoc.get("from") as! String
        self.to = withDoc.get("to") as! String
        self.msg = withDoc.get("msg") as! String
        self.timestamp = withDoc.get("timestamp") as! Int
    }
}

然后我们需要一个类级别的数组来存储它,以便我们以后可以使用它 - 可能作为 tableView 数据源

class ViewController: NSViewController {
    var sortedChatArray = [ChatClass]()

设置是我们有两个用户,Jay 和 Cindy,我们想要检索他们之间的所有聊天并按时间戳排序(在这种情况下只是一个 Int)。

下面的代码从一个用户读取所有聊天到另一个用户创建 ChatClass 对象并将它们添加到一个数组中。完成后,该数组将传递回调用完成处理程序以进行进一步处理。

func chatQuery(from: String, to: String, completion: @escaping( [ChatClass] ) -> Void) {
    let chatsColl = self.db.collection("chats") //self.db points to my Firestore
    chatsColl.whereField("from", isEqualTo: from).whereField("to", isEqualTo: to).getDocuments(completion: { snapshot, error in
        if let err = error {
            print(err.localizedDescription)
            return
        }

        guard let docs = snapshot?.documents else { return }

        var chatArray = [ChatClass]()

        for doc in docs {
            let chat = ChatClass(withDoc: doc)
            chatArray.append(chat)
        }

        completion(chatArray)
    })
}

然后是棘手的部分。代码调用上面的代码返回一个数组再次调用上面的代码,返回另一个数组。数组被组合、排序并打印到控制台。

func buildChatArray() {
    self.chatQuery(from: "Jay", to: "Cindy", completion: { jayCindyArray in
        self.chatQuery(from: "Cindy", to: "Jay", completion: { cindyJayArray in
            let unsortedArray = jayCindyArray + cindyJayArray
            self.sortedChatArray = unsortedArray.sorted(by: { $0.timestamp < $1.timestamp })

            for chat in self.sortedChatArray {
                print(chat.timestamp, chat.from, chat.to, chat.msg)
            }
        })
    })
}

和输出

ts: 2  from: Cindy  to: Jay  msg: Hey Jay, Sup.
ts: 3  from: Jay    to: Cindy  msg: Hi Cindy. Not much
ts: 9  from: Jay    to: Cindy  msg: Talk to you later

【讨论】:

  • 非常完整的答案,点赞,模型和存储部分不包括在内,因为我想让问题尽可能简单,但无论如何感谢您的澄清!
猜你喜欢
  • 2018-10-11
  • 2020-01-27
  • 2021-04-28
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多