Javascript 在快照后操作Firebase元素

Javascript 在快照后操作Firebase元素,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我有一个函数,当点击搜索表单上的按钮时会被调用。我们得到字符串并检查它,以确保它只是字母。然后我们检查玩家的名字是否已经在数据库中,如果没有,我们就添加他。如果他在数据库中,我们转到语句的else部分。这很好——但在我的另一个领域,当我们确定数据库中有一个名字完全相同的玩家时,我想为该玩家操作数据库中的一个特征。具体来说,在玩家计票中加1 writePlayer(newPlayerContent){ if (/^[a-zA-Z\s]*$/.test(this.state.newPlayerCon

我有一个函数,当点击搜索表单上的按钮时会被调用。我们得到字符串并检查它,以确保它只是字母。然后我们检查玩家的名字是否已经在数据库中,如果没有,我们就添加他。如果他在数据库中,我们转到语句的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:{玩家内容:“测试”,排名:0,投票:0}

我想在userData中对播放器进行一次投票。我就是不知道要在else语句中添加什么来更改字段数据

我的火力基地是这样布置的:

players
    playerContent: "Test"
    rank: 0
    votes: 0
试试这个

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;
         });
      });
    })
}

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

这是我需要的,谢谢。但是,当我通过搜索功能进行投票时,它会将数据库中的用户信息更改为一个键和一个投票计数,删除他们的姓名(playerContent)和排名。基本上只需一个投票计数就可以覆盖键的内容,我还添加了
playerContent:data.playerContent
,并重新输入了名称。不确定这是否是最好的方法,但目前做得很好。