2016-04-28 6 views
0

私はrethinkdbの新人です。私はプレーヤーの死亡および死亡を記録する必要があるゲームサーバー用の管理ツールを開発中です。 、私は殺人、被害者、武器の名前を返しキル上のサーバーとイベントが発生しますから、現在のセッションIDを取得ネストされたドキュメントを作成、更新、または追加する方法

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

:私は「名前」がセカンダリインデックスであるプレーヤーのための次のような構造を持っていますとヘッドショット(真/偽)。セッションは現在のidに存在する場合は1

  • を作成し、サーバーからの電流idのプレイヤーセッションが存在しない場合は

    • :私は次のように関係する両方のプレイヤーへの更新を作成する必要がありますプレーヤーのために
      • 武器は1とレコードを作成存在しない場合は殺す
        • 更新に合計キル数、ヘッドショット・キル比
        • を作ります名前武器がプレイヤーのためにキルとヘッドショット
      • の更新番号が存在する総死亡
    • 更新番号を殺された場合は、殺し、そしてヘッドショット
    • 私は上記のプレーヤーの構造を維持する必要がありますが、プレーヤーを更新する方法を公開しています。

    +0

    こんにちはAustin、あなたはこれに対する解決策を見つけましたか? – 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を使用すると、プレーヤーテーブルとセッションテーブルの間で簡単に簡単に参加できます。

    関連する問題