在快照之后操作Firebase元素

时间:2017-11-14 08:27:13

标签: javascript firebase firebase-realtime-database

我有一个在点击搜索表单上的按钮时调用的函数。我们得到字符串并检查它以确保它只是字母。然后我们检查玩家名字是否已经在数据库中,如果不是,我们加他。如果他在数据库中,我们会转到声明的else部分。这工作正常 - 但是在我的其他领域,当我们确定在数据库中确实存在一个具有完全相同名称的播放器时,我想要操纵该播放器的数据库中的一个特征。具体来说,在球员投票数上加1。

writePlayer(newPlayerContent){
if (/^[a-zA-Z\s]*$/.test(this.state.newPlayerContent)) {
    this.checkIfUserExists(this.state.newPlayerContent);

    if(this.state.duplicate !== true){
    this.props.addPlayer(this.state.newPlayerContent);
    this.setState({
        newPlayerContent: '',
        })
    }
    else{
        var playersRef = firebase.database().ref();
        playersRef.child('players').orderByChild("playerContent").equalTo(this.state.newPlayerContent).once("value",snapshot => {
        const userData = snapshot.val();
        console.log(userData)
        })
    }
}
else {
    console.log("Non-letter character found in: " + this.state.newPlayerContent)
    }

}

当我这样做 console.log(userData) 时,我收到了我想要操作的特定玩家的相关信息 - 例如

  

-KytHrvt8R1DkY0E4Fho:{playerContent:“Test”,排名:0,投票:0}

我想在userData中对玩家进行投票++。我只是想不出要添加到我的else语句中的内容来更改那些字段数据。

我的Firebase布局如下:

players
    playerContent: "Test"
    rank: 0
    votes: 0

1 个答案:

答案 0 :(得分:2)

试试这个

else{
    var playersRef = firebase.database().ref();
    playersRef.child('players').orderByChild("playerContent").equalTo(this.state.newPlayerContent).once("value",snapshot => {
    snapshot.forEach(child => {
        const data = child.val();       
        const key = child.key
        //set the  vote count
        playersRef.child('players/'+key).update({
            votes: data.votes + 1;
         });
      });
    })
}

您需要遍历数据以获得实际结果,然后使用键指向所需的播放器并设置其值。希望这有帮助。