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.
Report Issue