2016-04-28 4 views
0

Я новичок в rethinkdb, и я работаю над инструментом администратора для игрового сервера, в котором мне нужно записывать убийства и смертельные случаи. У меня есть следующая структура для игрока, в котором «имя» является вторичным индексом:Как создать, обновить или добавить вложенный документ

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

Я получаю текущий идентификатор сеанса с сервера и пожары событий на убийстве, которое возвращает убийца, жертва, имя оружия, и headshot (true/false). Мне нужно создать обновление для обоих игроков, участвующих в следующем:

  • Если игрок сессии текущего идентификатора от сервера не существует, создайте один
  • Если сессия существует с текущим идентификатором, то
    • Для игрока делают уничтожения
      • Обновить количество всех убийств, и отношения к опыту уничтожающих
      • Если оружие не существует создать и запись имя, убивает, и выстрел в голову
      • Если оружие существует число обновлений фрагов и попаданий в голову
    • Проигрыватели быть убитыми
      • Update общее количество смертей

Мне нужно сохранить вышерасположенную структуру игрока, но я открыт, чтобы обновить игроков.

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

Вы можете видеть, что делает мутации на индексах во встроенном массиве вполне convuluted, как вы должны найти индекс элемента в массиве и затем используйте операцию .changeAt, чтобы заменить ее модифицированным оригиналом.

Я бы порекомендовал либо дожидаться окончания сеанса, чтобы обновить базу данных, и просто сохранить все данные на стороне клиента или на стороне сервера, пока вам не понадобится писать в db. Или сохраните документы сеанса игрока в новой таблице, которые вы можете найти более быстро и обновить более легко. Соединение между игровым столом и столом сеансов будет простым и быстрым с помощью .eqJoin.

Смежные вопросы