The DELETE DOCUMENTS statement removes one or more documents from a bundle based on specified filtering criteria. This operation is permanent and cannot be undone.
⚠️ WARNING: Deleted documents cannot be recovered. Always verify your WHERE clause before executing deletion.
DELETE DOCUMENTS FROM "<BUNDLE_NAME>" WHERE <CONDITION>;
Components:
DELETE DOCUMENTS - Specifies deletion operationFROM "<BUNDLE_NAME>" - Target bundle name (quoted)WHERE <CONDITION> - Filter criteria (required)The DELETE keyword indicates a document removal operation.
Characteristics:
Safety Features:
The DOCUMENTS keyword specifies that you are deleting documents (as opposed to bundles or other entities).
Characteristics:
DOCUMENT or plural DOCUMENTS (both accepted)FROM keywordThe FROM keyword specifies the source bundle containing documents to delete.
Syntax:
FROM "<BUNDLE_NAME>"
Characteristics:
Valid Examples:
DELETE DOCUMENTS FROM "users" WHERE ...
DELETE DOCUMENTS FROM "order_items" WHERE ...
DELETE DOCUMENTS FROM "UserProfiles" WHERE ...
The WHERE clause is required and defines which documents to delete based on filtering conditions.
Syntax:
WHERE <field> <operator> <value>
Characteristics:
==, !=, <, >, <=, >=AND, ORSyndrDB supports the following comparison operators in WHERE clauses:
| Operator | Description | Example |
|---|---|---|
== |
Equal to | WHERE id == 1 |
!= |
Not equal to | WHERE status != "active" |
< |
Less than | WHERE age < 18 |
> |
Greater than | WHERE price > 100 |
<= |
Less than or equal | WHERE quantity <= 5 |
>= |
Greater than or equal | WHERE score >= 90 |
Type Support:
age == 25, price > 99.99name == "John", status != "inactive"active == true, verified == falseCombine multiple conditions using logical operators:
| Operator | Description | Example |
|---|---|---|
AND |
Both conditions must be true | WHERE age > 18 AND status == "active" |
OR |
At least one condition must be true | WHERE role == "admin" OR role == "moderator" |
Precedence:
AND has higher precedence than ORUse parentheses () to group conditions and control evaluation order:
-- Delete users who are either minors OR seniors, but only if inactive
DELETE DOCUMENTS FROM "users"
WHERE (age < 18 OR age > 65) AND status == "inactive";
-- Delete orders that are pending AND either high priority OR high value
DELETE DOCUMENTS FROM "orders"
WHERE status == "pending" AND (priority == "high" OR amount > 1000);
Delete by ID:
DELETE DOCUMENTS FROM "users" WHERE id == 1;
Delete by string field:
DELETE DOCUMENTS FROM "users" WHERE name == "John Doe";
Delete by boolean:
DELETE DOCUMENTS FROM "settings" WHERE enabled == false;
Without semicolon (optional):
DELETE DOCUMENTS FROM "users" WHERE id == 99
Not equal:
DELETE DOCUMENTS FROM "users" WHERE status != "active";
Less than:
DELETE DOCUMENTS FROM "products" WHERE stock < 10;
Greater than:
DELETE DOCUMENTS FROM "products" WHERE price > 1000;
Less than or equal:
DELETE DOCUMENTS FROM "orders" WHERE quantity <= 5;
Greater than or equal:
DELETE DOCUMENTS FROM "employees" WHERE age >= 65;
AND operator:
DELETE DOCUMENTS FROM "users"
WHERE age > 30 AND status == "inactive";
OR operator:
DELETE DOCUMENTS FROM "users"
WHERE role == "guest" OR verified == false;
Multiple AND conditions:
DELETE DOCUMENTS FROM "products"
WHERE price > 100 AND stock < 10 AND discontinued == true;
Mixed AND/OR with parentheses:
DELETE DOCUMENTS FROM "orders"
WHERE status == "pending" AND (amount > 1000 OR priority == "high");
Age range with status:
DELETE DOCUMENTS FROM "users"
WHERE (age < 18 OR age > 65) AND active == true;
Multi-field product cleanup:
DELETE DOCUMENTS FROM "products"
WHERE discontinued == true AND stock == 0 AND price < 5;
Order cancellation cleanup:
DELETE DOCUMENTS FROM "orders"
WHERE status == "cancelled" AND created_date < "2024-01-01";
Expired sessions:
DELETE DOCUMENTS FROM "sessions"
WHERE expires_at < "2024-11-20" OR active == false;
Field names can be quoted if they contain special characters or match keywords:
DocumentID field (quoted):
DELETE DOCUMENTS FROM "users" WHERE "DocumentID" == "123e4567-e89b-12d3-a456-426614174000";
Multiple quoted fields:
DELETE DOCUMENTS FROM "products"
WHERE "ProductID" == 456 AND "CategoryID" == 789;
Mixed quoted and unquoted:
DELETE DOCUMENTS FROM "orders"
WHERE "OrderID" == 1 AND status == "cancelled";
Fields with special characters:
DELETE DOCUMENTS FROM "data"
WHERE "field-with-dashes" == "value";
Test WHERE clause with SELECT first:
-- 1. Preview what will be deleted
SELECT * FROM "users" WHERE status == "inactive";
-- 2. Then delete if correct
DELETE DOCUMENTS FROM "users" WHERE status == "inactive";
Use specific conditions:
-- ✅ Specific deletion
DELETE DOCUMENTS FROM "logs" WHERE created_date < "2024-01-01";
Combine multiple conditions for safety:
-- ✅ Safe multi-condition deletion
DELETE DOCUMENTS FROM "temp_data"
WHERE type == "temporary" AND expires_at < "2024-11-20";
Delete by unique identifiers when possible:
-- ✅ Delete specific document
DELETE DOCUMENTS FROM "users" WHERE DocumentID == "abc-123";
Use transactions for related deletions:
-- Delete related documents in order
DELETE DOCUMENTS FROM "order_items" WHERE order_id == 123;
DELETE DOCUMENTS FROM "orders" WHERE id == 123;
Don't delete without testing WHERE clause:
DELETE DOCUMENTS FROM "users" WHERE name = "John"; -- ❌ Test first!
Don't use broad conditions on production data:
DELETE DOCUMENTS FROM "customers" WHERE true == true; -- ❌ Too broad!
Don't forget referential integrity:
DELETE DOCUMENTS FROM "users" WHERE id == 1; -- ❌ Check for related orders first!
Don't use ambiguous conditions:
DELETE DOCUMENTS FROM "products" WHERE active; -- ❌ Not supported - use == true
Error: expected WHERE after bundle name
Solution: Always include WHERE clause.
DELETE DOCUMENTS FROM "users" WHERE id == 1; -- ✅ Correct
Error: bundle 'xyz' not found
Solution: Verify bundle name (case-sensitive) exists in database.
Error: invalid WHERE clause expression
Solution: Check operator syntax and field references.
-- ❌ Wrong
DELETE DOCUMENTS FROM "users" WHERE id = 1;
-- ✅ Correct
DELETE DOCUMENTS FROM "users" WHERE id == 1;
Error: WHERE clause cannot be empty
Solution: Provide at least one condition.
DELETE DOCUMENTS FROM "users" WHERE status == "inactive";
Error: type mismatch in comparison
Solution: Ensure value types match field types.
-- ❌ Wrong - age is numeric
DELETE DOCUMENTS FROM "users" WHERE age == "25";
-- ✅ Correct
DELETE DOCUMENTS FROM "users" WHERE age == 25;
Info: 0 documents deleted
Explanation: No documents matched the WHERE clause criteria. This is not an error, but verify your WHERE clause is correct.
Error: cannot delete document - referenced by other documents
Solution: Delete dependent documents first or use cascade delete (if implemented).
-- Simple equality
DELETE DOCUMENTS FROM "bundle" WHERE field == value;
-- Comparison
DELETE DOCUMENTS FROM "bundle" WHERE field > value;
-- Logical AND
DELETE DOCUMENTS FROM "bundle" WHERE field1 == value1 AND field2 == value2;
-- Logical OR
DELETE DOCUMENTS FROM "bundle" WHERE field1 == value1 OR field2 == value2;
-- Grouped conditions
DELETE DOCUMENTS FROM "bundle" WHERE (cond1 OR cond2) AND cond3;
-- Quoted fields
DELETE DOCUMENTS FROM "bundle" WHERE "FieldName" == value;
| Operator | Usage | Example |
|---|---|---|
== |
Equality | id == 1 |
!= |
Inequality | status != "active" |
< |
Less than | age < 18 |
> |
Greater than | price > 100 |
<= |
Less/equal | quantity <= 5 |
>= |
Greater/equal | score >= 90 |
| Operator | Usage | Example |
|---|---|---|
AND |
Both true | age > 18 AND verified == true |
OR |
Either true | role == "admin" OR role == "mod" |
| Type | Example | Notes |
|---|---|---|
| String | "John" |
Double quotes |
| Integer | 25 |
No quotes |
| Float | 99.99 |
Decimal point |
| Boolean | true, false |
Lowercase |
| NULL | NULL |
Uppercase |
Version: SyndrDB 1.0
Last Updated: November 2024
Status: ✅ Implemented and tested