我们有一个 Firebase 表,其中有一个名为“guest”的游戏用户表。它有一个带有 JSON 键的用户列表,例如。
reference.Child("guest").OrderByChild("level").LimitToLast(100);
得到
"01e3ab2017b39a3809d7ac69aedd0957": {
"GuestUserProfileIndex": 0,
"MappingId": "01e3ab2017b39a3809d7ac69aedd0957",
"XP": 55395,
"coin": 32132400,
"first_Name": "GUEST",
"isOnline": false,
"isPlaying": false,
"isRewardedVideoSpin": false,
"lastDailyBonusTimeStamp": -8585100376467717008,
"lastSpinTimeStamp": 0,
"level": 12,
"name": "Masood khan",
"oldLevel": 12,
"profileURL": "",
"purchasableStriker": {
"selectIndex": 0,
"strikerPurchase": [
0
]
},
"referredUser": "",
"removeAds": false,
"rewardedVideoSpinCount": 3,
"timeStamp": -8584945728384719228,
"totalLinkedReferalUser": 0,
"totalLosserLevel": 92,
"totalWinnerLevel": 847,
"unlimitedFree2xSpin": false,
"unlimitedFreeSpin": false,
"userId": "01e3ab2017b39a3809d7ac69aedd0957",
"winningCoin": 72828300,
"winningCoinByReferral": 0
},
"03eeb04d6063f39c5c8246ffe5f97848": {
"GuestUserProfileIndex": 9,
"MappingId": "03eeb04d6063f39c5c8246ffe5f97848",
"XP": 104145,
"coin": 65512844,
"countryCode": "IN",
"first_Name": "GUEST",
"isOnline": false,
"isPlaying": false,
"isRewardedVideoSpin": false,
"lastDailyBonusTimeStamp": -8584959351,
"level": 10,
"name": "Ravi",
}
}
但是当想要显示排行榜来对用户进行排名时,我们只想从该表中获取最少的数据,而不是所有键。
例如仅此;
{
"01e3ab2017b39a3809d7ac69aedd0957": {
"level": 12,
"name": "Masood khan",
},
"03eeb04d6063f39c5c8246ffe5f97848": {
"level": 10,
"name": "Ravi",
}
}
因此我们可以节省不需要的数据的数据传输
将侦听器附加到节点时,您会下载该节点中存在的所有数据。这意味着,如果您的查询返回
Guest
对象,那么您将读取/下载这些节点内的所有数据。您确实可以从 snapshot
对象中仅选择您感兴趣的字段,但这并不意味着您没有下载整个节点。
如果您需要使用以下查询:
reference.Child("guest").OrderByChild("level").LimitToLast(100);
并且仅获取以下字段:
{
"01e3ab2017b39a3809d7ac69aedd0957": {
"level": 12,
"name": "Masood khan",
},
"03eeb04d6063f39c5c8246ffe5f97848": {
"level": 10,
"name": "Ravi",
}
}
那么你应该考虑对数据进行非规范化。这意味着您应该复制您感兴趣的数据,即另一个节点中的
level
和 name
字段,并查询该节点而不是原始节点。这样,您只会获得两个字段,而不是 30 个。因此您将节省大量带宽和资源。
如果您不熟悉 NoSQL 数据库,这可能听起来有点奇怪,但实际上这是一种很常见的做法。