我是rethinkdb的新手,我正在开发一个游戏服务器的管理工具,我需要记录玩家的死亡和死亡。对于“name”是次要索引的玩家,我有以下结构:
"name": NameofPlayer,
"sessions:" [
{
"id": IDofSession,
"kills": NumberofKills,
"deaths": NumberofDeaths,
"hskr": HSKR%,
"weapons": [
{
"name": WeaponName,
"kills": NumberofKills,
"headshots": NumberofHeadshots
},
]
},
]
我从服务器获取当前会话ID,并在kill上触发事件,返回杀手,受害者,武器名称和爆头(真/假)。我需要为参与以下内容的玩家创建更新:
我需要保留上述玩家结构,但我们愿意更新玩家。
答案 0 :(得分:0)
类似的东西应该可以解决问题:
const sessionId = 123;
const players = r.db("game").table("players");
r.branch(
// Check if session in player `sessions` array
players.get(playerId)('sessions').map((session) => {return session.id}).coerceTo('array').contains(sessionId),
//
players.get(playerId).update({
'sessions': r.row('sessions').append({
'id': newSessionId,
// Set rest of initial values here
})
}),
// Else don't need to do anything
'_'
// Now we insert the kill
).do((_) => {
var original_session = players.get(playerId)('sessions').filter(r.row('id').eq(sessionId));
var original_session_index = players.get(playerId)('sessions').offsetsOf(r.row('id').eq(sessionId);
players.get(playerId).update({
'sessions': r.row('sessions').changeAt(
// First get index
original_index,
// Then create replacement object
original_session.merge({
// New values go here which will overwrite previous ones.
// e.g. update kills, deaths, weapons etc.
kills: original_session('kills').add(1),
deaths: original_session('deaths').add(3)
})
)
})
})
您可以看到,对嵌入数组中的索引进行突变非常紊乱,因为您必须在数组中找到该项的索引,然后使用.changeAt
操作将其替换为已修改的原始数据。
我建议要么等到会话结束才更新数据库,只是保留所有数据客户端或服务器端,直到你需要写入数据库。或者,将玩家会话文档保存在新表中,您可以更快地找到并更轻松地更新。使用.eqJoin
可以轻松快捷地加入播放器表和会话表。