如何创建,更新或附加嵌套文档

时间:2016-04-28 23:11:15

标签: rethinkdb rethinkdb-javascript

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

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

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

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

我需要保留上述玩家结构,但我们愿意更新玩家。

1 个答案:

答案 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可以轻松快捷地加入播放器表和会话表。