Crud Operations

Delete Operations

Remove documents from MongoDB collections

DeleteOne

Delete a single document matching a filter.

local count = collection:DeleteOne(filter)

Parameters:

  • filter (table): Query filter Returns:
  • number: Number of documents deleted (0 or 1)

Examples

-- Delete specific player
local deleted = players:DeleteOne({
    steamid = "STEAM_0:1:12345"
})
if deleted > 0 then
    print("Player deleted")
else
    print("Player not found")
end
-- Delete ban record
bans:DeleteOne({ ban_id = "BAN_12345" })
-- Delete oldest log
logs:DeleteOne({})  -- Deletes first match

DeleteMany

Delete all documents matching a filter.

local count = collection:DeleteMany(filter)

Parameters:

  • filter (table): Query filter Returns:
  • number: Number of documents deleted

Examples

-- Delete old logs (90 days)
local deleted = logs:DeleteMany({
    created_at = { ["$lt"] = os.time() - (90 * 24 * 60 * 60) }
})
print("Deleted", deleted, "old logs")
-- Delete banned players
players:DeleteMany({ banned = true })
-- Delete test data
players:DeleteMany({
    username = { ["$regex"] = "^Test_" }
})

DeleteMany({}) with an empty filter will delete ALL documents! Always double-check your filters.

Real-World Examples

Cleanup Old Data

-- Run cleanup every day
timer.Create("DatabaseCleanup", 24 * 60 * 60, 0, function()
    local thirtyDaysAgo = os.time() - (30 * 24 * 60 * 60)
    -- Delete old logs
    local logs = logsDB:DeleteMany({
        created_at = { ["$lt"] = thirtyDaysAgo }
    })
    -- Delete expired temp bans
    local bans = bansDB:DeleteMany({
        expires_at = { ["$lt"] = os.time() },
        permanent = false
    })
    print("Cleanup: Deleted", logs, "logs and", bans, "expired bans")
end)

Delete Player Command

concommand.Add("deleteplayer", function(ply, cmd, args)
    if not ply:IsSuperAdmin() then return end
    local steamid = args[1]
    if not steamid then
        ply:ChatPrint("Usage: deleteplayer <steamid>")
        return
    end
    local deleted = players:DeleteOne({ steamid = steamid })
    if deleted > 0 then
        ply:ChatPrint("Player deleted successfully")
    else
        ply:ChatPrint("Player not found")
    end
end)

Best Practices

  1. Be specific with filters - don't delete more than intended
  2. Soft delete instead - set deleted = true for important data
  3. Backup first before bulk deletes in production
  4. Log deletions for audit trail
  5. Use scheduled cleanup for maintenance

Next Steps

Query Filters

Learn advanced query operators

Common Patterns

CRUD best practices