Database Ops · 4 of 6
delete / delete_one
Remove documents. delete hits every match; delete_one stops after one.
Signatures
delete(collection, query)
delete_one(collection, query)
Delete by id
proc remove_user(id) {
delete_one("users", {_id: id})
return {ok: true}
}
Delete with confirmation
proc safe_delete(id, confirmation) {
let user = find_one("users", {_id: id})
if user == null { abort "not found" }
if confirmation != user.email { abort "confirmation must match email" }
delete_one("users", {_id: id})
return {ok: true, deleted: id}
}
Bulk delete
proc purge_old_logs(days) {
delete("logs", {age_days: {$gte: days}})
return {remaining: count("logs")}
}
Soft delete (preferred for user data)
Hard delete can't be undone. For most user-facing data, mark a flag instead:
proc soft_delete_user(id, reason) {
let u = find_one("users", {_id: id})
if u == null { abort "not found" }
update("users", {_id: id}, {
$set: {deleted: true, deleted_at: "now", deleted_reason: reason}
})
insert("audit_log", {action: "delete", target: id, original: u})
return {ok: true}
}
Cascade delete
proc remove_account(account_id) {
delete("transactions", {account_id: account_id})
delete("sessions", {account_id: account_id})
delete("notifications", {user_id: account_id})
delete_one("accounts", {_id: account_id})
return {ok: true}
}
Conditional cascade
proc remove_team(team_id) {
let members = count("members", {team_id: team_id})
if members > 0 { abort "team has members" }
delete_one("teams", {_id: team_id})
return {ok: true}
}
Atomic cascade: all the deletes in
remove_account above run in one transaction. If any step fails, nothing is removed.