Firebase游戏匹配算法

时间:2016-02-06 17:09:20

标签: algorithm firebase

我正在尝试创建播放器匹配算法。所以基本上我希望它能像那样工作:

算法:

  1. 玩家创建指定betgameType的游戏请求。
  2. 服务器订阅以下查询:
  3. {
      'gameRequests': {
        '1': {
          createdAt: 1454777718074,
          uid: 123,
          bet: 10,
          gameType: 'nhl'
        },
        '2': {
          createdAt: 1454777718075,
          uid: 123,
          bet: 20,
          gameType: 'nhl'
        },
        '3': {
          createdAt: 1454777718076,
          uid: 321,
          bet: 10,
          gameType: 'nhl'
        },
      }
    }
    

    我会收到关键'1''3'的请求。

    1. 现在,我只需删除密钥为'1''3'的子项,并为其创建游戏。
    2. 我有什么:

      到目前为止,我正在加载整个gameRequests分支。

      randomGamesRef.on('value', onGameRequestsUpdate)
      
      function onGameRequestsUpdate (snapshot) {
          const gameRequests = snapshot.val()
      
          const pairs = _.chain(gameRequests)
            // Transform to array
            .values()
      
            // Group by sport and bet size
            .groupBy((req) => req.gameType + '+' + req.bet)
      
            // Map groups to pairs
            .map((group) => {
              return _.chain(group)
                .uniqBy('createdBy')
                .take(2)
                .value()
            })
            .filter((pairs) => pairs.length === 2)
            .value()
      
          // Now having this pairs I can delete them 
          // from the database and create new game
        }
      

      但每次将所有内容加载到内存中似乎不是一个好主意。

      问题:您如何在Firebase中实施它?

1 个答案:

答案 0 :(得分:1)

在NoSQL中,您通常最终会根据您希望在代码中访问数据的方式对数据进行建模。因此,不要阅读所有游戏请求,然后在代码中按gameTypebet对其进行分组,请考虑将它们存储在合并gameTypebet的密钥下:

{
  'gameRequests': {
    'nhl_10': {
      '1': {
        createdAt: 1454777718074,
        uid: 123,
      },
      '3': {
        createdAt: 1454777718076,
        uid: 321,
      }
    },
    'nhl_20': {
      '2': {
        createdAt: 1454777718075,
        uid: 123,
      }
    }
  }
}

现在您的代码变为:

function onGameRequestsUpdate (snapshot) {
   snapshot.forEach(function(gametypeSnapshot) {
     if (gametypeSnapshot.numChildren() >= 2) {
       // there is at least one request pair for this game type
     }
   });
};

我一直建议人们阅读this article,因为它解释了NoSQL Data Modeling techniques这样的内容。