2

我试图在 Firestore 中更改字段时获取该字段的旧值。有什么方法可以访问字段更改后的先前值是什么?这是我当前的代码,我想访问旧nickName.modified并打印出新nickName的和旧的。

db.collection("cities").whereField("state", isEqualTo: "CA").addSnapshotListener { querySnapshot, error in
    guard let snapshot = querySnapshot else {
        print("Error fetching snapshots: \(error!)")
        return
    }
    snapshot.documentChanges.forEach { diff in
        if (diff.type == .added) {
            print("New city: \(diff.document.data())")
        let nickName = myData["nickName"] as? String ?? ""
        }
        if (diff.type == .modified) {
            let nickName = myData["nickName"] as? String ?? ""
        }
        if (diff.type == .removed) {
            let nickName = myData["nickName"] as? String ?? ""
        }
    }
}
4

1 回答 1

1

不幸的是,这不是 Firestore 的功能。您可以做的是拥有另一个字段并使用 Firebase 函数,在字段更改oldNickName时自动更新该字段。nickName

最好的解决方案是nickName本地存储,因此您可以在nickName更改时引用本地变量,访问数据库中新更新的变量和本地变量nickName。这是更新的代码:

var nickNames = [String : String]()
db.collection("cities").whereField("state", isEqualTo: "CA").addSnapshotListener { snapshot, error in
    guard error == nil, let snapshot = snapshot?.documentChanges else { return }
    snapshot.forEach {
        let document = $0.document
        let documentID = document.documentID
        let nickName = document.get("nickName") as? String ?? "Error"
        switch $0.type {
            case .added:
                print("New city: \(document.data())")
                nickNames[documentID] = nickName
            case .modified:
                print("Nickname changed from \(nickNames[documentID]) to \(nickName)")
                nickNames[documentID] = nickName
            case .removed:
                print("City removed with nickname \(nickNames[documentID])")
                nickNames.removeValue(forKey: documentID)
        }
    }
}

nickNames是具有 keycityID和 value的字典nickName。这段代码是用Swift 5.

于 2019-03-31T18:09:48.640 回答