我正在尝试创建播放器匹配算法。所以基本上我希望它能像那样工作:
算法:
bet
和gameType
的游戏请求。{
'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'
,'3'
的子项,并为其创建游戏。我有什么:
到目前为止,我正在加载整个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中实施它?
答案 0 :(得分:1)
在NoSQL中,您通常最终会根据您希望在代码中访问数据的方式对数据进行建模。因此,不要阅读所有游戏请求,然后在代码中按gameType
和bet
对其进行分组,请考虑将它们存储在合并gameType
和bet
的密钥下:
{
'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这样的内容。