在Firestore数据库(Swift)中更新阵列内Map中的阵列

bsxbgnwa  于 2023-01-04  发布在  Swift
关注(0)|答案(1)|浏览(113)

struct Game: Codable {
    
    let id: String
    
    var table = Table()
    
    var players = [Player]()
    
    var player1ID = ""
    var player2ID = ""
    
    var currentPlayerSetCountShouldAnimate = false
    var opponentSetCountShouldAnimate = false
    
    init(currentPlayer: Player) {
        id = UUID().uuidString
        players.append(currentPlayer)
        players[0].playerNumber = 0
        player1ID = currentPlayer.id
    }
}

struct Player: Codable, Equatable {
    var id = UUID().uuidString
    
    var playerNumber = 0
    
    var selectedCards: [Card]
    var collectedSets: [Card]
    var selectedCardsIndexes: [Int]
    
}

我将Game对象存储在Firestore数据库中,而不是在向selectedCards数组添加Card对象时更新整个游戏,我只想更新当前玩家的selectedCards数组。

func updatePlayerSelectedCards(player: Player) {
    do {
        let selectedCards = try JSONEncoder().encode(player.selectedCards)
        let gameRef = Firestore.firestore().collection("Game").document(game.id)
        let playerRef = gameRef.collection("players")

        playerRef.document("\(player.playerNumber)").updateData(["selectedCards": selectedCards]) { (error) in
            if let error = error {
                print("Error updating selectedCards field: \(error)")
            } else {
                print("Successfully updated selectedCards field")
            }
        }
    } catch {
        print(error.localizedDescription)
    }
}

我已经编写了很多关于这个函数的变体,但是当我试图访问players数组的playerNumber索引时,它给了我这个错误:
[FirebaseFirestore][I-FST 000001]写入数据流(7 f9 b27810 c 08)数据流错误:'未找到:没有要更新的文档:项目/设置游戏bc/数据库/(默认)/文档/游戏/FC 600 D8 C-85 DC-4465-8648- 31 FFA 90086 EB/玩家/0'
在所附的图片中,很明显,索引(在本例中为0)存在于播放器数组中。它不是一个文档吗?我需要使用FieldValue.arrayUnion吗?这是我的第一个“大型”项目,我觉得完成这个项目应该不难,所以我想我可能错过了一些简单的东西。任何帮助和澄清都将非常感谢。

xeufq47z

xeufq47z1#

问题从这里开始:

let playerRef = gameRef.collection("players")
playerRef.document("\(player.playerNumber)")...

这段代码试图更新players集合中的$player.playerNumber文档。但是您的屏幕截图显示players字段在另一个命名的文档中。因此没有名为players的文档,这解释了错误消息。
在Firestore中没有方法操作符来更新数组字段中的项;唯一的操作符是添加唯一项、移除特定项或设置整个字段。
因此,如果array_union运算符对于您的用例来说不够好,您必须:1)读取数组,2)在应用程序代码中更新它,3)将整个数组写回数据库。
另请参阅:Firestore Update single item in array of objects

相关问题