0

我是 rethinkdb 的新手,我正在开发一个游戏服务器的管理工具,我需要在其中记录玩家的杀戮和死亡。对于“名称”是二级索引的玩家,我有以下结构:

"name": NameofPlayer,
"sessions:" [
    {
        "id": IDofSession,
        "kills": NumberofKills,
        "deaths": NumberofDeaths,
        "hskr": HSKR%,
        "weapons": [
            {
                "name": WeaponName,
                "kills": NumberofKills,
                "headshots": NumberofHeadshots
            },
        ] 
   },
]

我从服务器获取当前会话 ID,并且在返回杀手、受害者、武器名称和爆头(真/假)的杀戮时触发一个事件。我需要为涉及以下内容的两个玩家创建更新:

  • 如果来自服务器的当前 id 的玩家会话不存在,则创建一个
  • 如果当前 id 存在会话,则
    • 对于玩家进行杀戮
      • 更新总击杀数和爆头击杀率
      • 如果武器不存在,则创建一个并记录名称、杀戮和爆头
      • 如果存在武器,则更新击杀次数和爆头次数
    • 对于被杀的玩家
      • 更新总死亡人数

我需要保留上述播放器结构,但对如何更新播放器持开放态度。

4

1 回答 1

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.

于 2016-05-02T19:55:24.617 回答