2016-04-28 22 views
0

我是rethinkdb的新手,我正在開發一款遊戲服務器的管理工具,我需要在其中記錄玩家的殺死和死亡事件。我有一個球員如下結構,其中「name」是一個輔助指標:如何創建,更新或追加嵌套的文檔

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

我從服務器獲取當前會話ID和一個返回殺手,受害者,武器名稱殺人的事件觸發,和headshot(真/假)。我需要創建一個更新雙方球員參與的情況如下:

  • 如果從服務器的當前ID的玩家會不存在,創建一個
  • 如果會話與當前的ID存在,那麼
    • 對於玩家使殺
      • 更新總殺敵數和爆頭殺比
      • 如果武器不存在創建一個記錄名,殺死和爆頭
      • 如果武器存在殺敵的更新數量和爆頭
    • 對於玩家被殺死 死亡總數
  • 更新數

    我需要保持上面的球員結構,但是如何更新球員。

+0

嘿奧斯汀,你找到了解決辦法嗎? – dalanmiller

回答

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

你可以看到,在嵌入式陣列做索引上的突變是相當convul​​uted因爲你必須找到該項目的數組中的索引和然後使用.changeAt操作將其替換爲修改後的原件。

我會建議要麼等到會話結束才更新數據庫,而只是保留客戶端或服務器端的所有數據,直到需要寫入數據庫爲止。或者,將播放器會話文檔保存在一個新表格中,您可以更快速地找到並更輕鬆地進行更新。通過.eqJoin可輕鬆快速地連接您的球員桌和會議桌。