Create or update in one operation:
players:UpdateOne(
{ steamid = steamid },
{
["$set"] = { username = name, last_seen = os.time() },
["$setOnInsert"] = { created_at = os.time(), level = 1 }
},
true -- upsert
)
-- Safe counter increment
stats:UpdateOne(
{ key = "page_views" },
{ ["$inc"] = { count = 1 } },
true
)
-- Purchase only if enough credits
local success = players:UpdateOne(
{
steamid = steamid,
credits = { ["$gte"] = price }
},
{
["$inc"] = { credits = -price },
["$push"] = { purchases = itemId }
}
)
return success > 0
local function GetPage(pageNum, perPage)
return players:Aggregate({
{ ["$sort"] = { level = -1 } },
{ ["$skip"] = (pageNum - 1) * perPage },
{ ["$limit"] = perPage }
})
end
-- Don't delete, mark as deleted
players:UpdateOne(
{ steamid = steamid },
{
["$set"] = {
deleted = true,
deleted_at = os.time()
}
}
)
-- Query excluding deleted
players:Find({ deleted = { ["$ne"] = true } })