How to get a datastore where multiple data is saved

Hi Guys, so I’m making a simulator and I have made my data system in this way -

local DS = game:GetService("DataStoreService")
local DataStore = DS:GetDataStore("Data")

game.Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder", player)
	leaderstats.Name = "leaderstats"
	
	local Strength = Instance.new("IntValue", leaderstats)
	Strength.Name = "Strengths"
	Strength.Value = 0
	
	local Rebirths = Instance.new("IntValue", leaderstats)
	Rebirths.Name = "Rebirths"
	Rebirths.Value = 0
	
	local data
	local data2
	local success, err = pcall(function()
		data = DataStore:GetAsync(player.UserId.."power")
		data2 = DataStore:GetAsync(player.UserId.."rebirth")
	end)
	if success then
		Strength.Value = data
	else
		warn(err)
	end
end)

game.Players.PlayerRemoving:Connect(function(player)
	local data
	local data2
	local success, err = pcall(function()
		data = DataStore:SetAsync(player.UserId.."power", player.leaderstats.Strengths.Value)
		data2 = DataStore:SetAsync(player.UserId.."rebirth", player.leaderstats.Rebirths.Value)
	end)
	if success then
		print("Saved")
	else
		warn(err)
	end
end)

game:BindToClose(function()
	for i,v in pairs(game.Players:GetPlayers()) do
		v:Kick("Server Closed")
	end
end)

Now the problem is I have a global leaderboard which doesn’t works , probably because I have saved 2 data in one datastore and my global leaderboard which gets the datastore can’t access the things we want. Like I want to make a strength leaderboard but as I have saved rebirths and strengths in a same datastore, it doesn’t know probably and it doesn’t works

My global leaderboard script -

local DataStoreService = game:GetService("DataStoreService")
local CashDataStore = DataStoreService:GetOrderedDataStore("Data")

local leaderboard = script.Parent.Parent.Parent
local RefreshRate = 30

local function RefreshLeaderboard()
	
	for i, Player in pairs(game.Players:GetPlayers()) do
		CashDataStore:SetAsync(Player.UserId.."power", Player.leaderstats.Strengths.Value)-- You can add your Currency Value by writing Player.leaderstats.(Your currency name).Value
	end
	
	local Success, Error = pcall(function()
		
		local Data = CashDataStore:GetSortedAsync(false, 10)
		local CashPage = Data:GetCurrentPage()
		
		for Rank, SavedData in ipairs(CashPage) do
			local Key = string:gsub(tostring(SavedData.key, "power", ""))
			local Username = game.Players:GetNameFromUserIdAsync(tonumber(Key))
			local Cash = SavedData.value
			
			if Cash then
				
				local NewList = script.Parent.List:Clone()
				NewList.Parent = leaderboard.SurfaceGui.Frame
				NewList.Name = Username
				NewList.Text = "#"..Rank.."  "..Username.."  "..Cash
				NewList.Visible = true
				NewList.ImageLabel.Image = game:GetService("Players"):GetUserThumbnailAsync(game.Players:GetUserIdFromNameAsync(Username), Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size420x420)
				
				
			end
		end
	end)
end

while true do
	
	for i, Label in pairs(leaderboard.SurfaceGui.Frame:GetChildren()) do
		if Label.Name ~= "List" and Label:IsA("TextLabel") then
			Label:Destroy()
		end
	end
	
	RefreshLeaderboard()
	wait(RefreshRate)
end

Now I want to know how to only access the strength and display it. Thanks !

You should use a dictionary, e.g.:

local success, data = pcall(DataStore.GetAsync, DataStore, player.UserId)

print(data) --[[ Output
	{
		Power = ...,
		Rebirth = ...,
		
		Others = {
			Money = ...,
			Inventory = { ... }
		}
	}
]]
local data = {
	Power = ...,
	Rebirth = ...,

	Others = {
		Money = ...,
		Inventory = { ... }
	}
}

local success, errorMessage = pcall(DataStore.SetAsync, DataStore, player.UserId, data)
2 Likes

Основная проблема у тебя в том, что глобальная таблица лидеров должна храниться не в DataStore, а в OrderedDataStore.

DataStore предоставляет доступ к данным по ключу. Т.е. вы сможете получить значение данных только тех, что запросите.

OrderedDataStore - предоставляет страничный доступ к данным, т.е. позволяет получить сразу множество значений к тому же отсортированных по возрастанию или убыванию.

В связи со всем выше сказанным вам нужно работать одновременно с обеими базами данных. В одной хранить все данные каждого игрока, а во второй только те, на основании которых собираетесь строить LeaderBoards.

Вот пример создания LeaderBoards.

I`m not that good with datastores, tysm for good example, it explains a lot! Also sorry for being late :slight_smile: