UpdatePromise<T, I, J>The UpdatePromise class provides a chainable interface for configuring UPDATE operations before execution. It extends Promise, allowing you to await it directly or chain configuration methods.
Returned by: SurrealQueryable.update()
Source: query/update.ts
T - The result typeI - The input type for record dataJ - Boolean indicating if result is JSON (default: false).content()Replace the entire record content with new data.
Method SyntaxupdatePromise.content(data)
| Parameter | Type | Description |
|---|---|---|
data required | Values<I> | Complete replacement data (excluding id field). |
UpdatePromise<T, I, J> - Chainable promise
const user = await db.update(new RecordId('users', 'john')) .content({ name: 'John Smith', email: 'john.smith@example.com', age: 31 }); // Replaces all fields
.merge()Merge partial updates into the existing record.
Method SyntaxupdatePromise.merge(data)
| Parameter | Type | Description |
|---|---|---|
data required | Partial<Values<I>> | Partial data to merge (only specified fields are updated). |
UpdatePromise<T, I, J> - Chainable promise
Update Single Fieldconst user = await db.update(new RecordId('users', 'john')) .merge({ email: 'newemail@example.com' }); // Only updates email, other fields unchanged
Update Multiple Fieldsconst user = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com', age: 31, updated_at: DateTime.now() });
.replace()Replace specific fields while keeping others unchanged.
Method SyntaxupdatePromise.replace(data)
| Parameter | Type | Description |
|---|---|---|
data required | Values<I> | Fields to replace. |
UpdatePromise<T, I, J> - Chainable promise
const user = await db.update(new RecordId('users', 'john')) .replace({ status: 'inactive' });
.patch()Apply JSON Patch operations to update the record.
Method SyntaxupdatePromise.patch(operations)
| Parameter | Type | Description |
|---|---|---|
operations required | PatchOperation[] | JSON Patch operations to apply. |
UpdatePromise<T, I, J> - Chainable promise
const user = await db.update(new RecordId('users', 'john')) .patch([ { op: 'replace', path: '/email', value: 'new@example.com' }, { op: 'add', path: '/tags/-', value: 'premium' } ]);
.where()Add a WHERE clause to conditionally update records.
Method SyntaxupdatePromise.where(condition)
| Parameter | Type | Description |
|---|---|---|
condition required | ExprLike | The condition expression (string or Expression object). |
UpdatePromise<T, I, J> - Chainable promise
Conditional Updateconst users = await db.update(new Table('users')) .merge({ verified: true }) .where('email_confirmed = true');
With Expression Builderimport { expr } from 'surrealdb'; const users = await db.update(new Table('users')) .merge({ status: 'inactive' }) .where(expr(({ lt, field }) => lt(field('last_login'), DateTime.parse('2024-01-01')) ));
.output()Specify what to return from the update operation.
Method SyntaxupdatePromise.output(fields)
| Parameter | Type | Description |
|---|---|---|
fields required | Output | ”NONE”, “BEFORE”, “AFTER”, “DIFF”, or field list. |
UpdatePromise<T, I, J> - Chainable promise
Return Updated Recordconst user = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com' }) .output('AFTER'); // Returns the record after update
Return Only Changed Fieldsconst diff = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com' }) .output('DIFF'); // Returns only the changed fields
Return Original Recordconst original = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com' }) .output('BEFORE'); // Returns the record before update
.timeout()Set a timeout for the operation.
Method SyntaxupdatePromise.timeout(duration)
| Parameter | Type | Description |
|---|---|---|
duration required | Duration | Maximum time to wait. |
UpdatePromise<T, I, J> - Chainable promise
.version()Update at a specific version (for versioned storage engines).
Method SyntaxupdatePromise.version(timestamp)
| Parameter | Type | Description |
|---|---|---|
timestamp required | DateTime | The version timestamp. |
UpdatePromise<T, I, J> - Chainable promise
.json()Return result as JSON string.
Method SyntaxupdatePromise.json()
UpdatePromise<T, I, true> - Promise returning JSON string
.stream()Stream results as they arrive.
Method SyntaxupdatePromise.stream()
AsyncIterableIterator - Async iterator
import { Surreal, RecordId, Table } from 'surrealdb'; const db = new Surreal(); await db.connect('ws://localhost:8000'); // Update single record with merge const user = await db.update(new RecordId('users', 'john')) .merge({ email: 'john.new@example.com' }); // Replace entire record content const user = await db.update(new RecordId('users', 'john')) .content({ name: 'John Doe', email: 'john@example.com', age: 30, role: 'admin' });
// Update all users matching condition const updated = await db.update(new Table('users')) .merge({ verified: true }) .where('email_confirmed = true'); console.log(`Updated ${updated.length} users`);
// Update only if condition is met const users = await db.update(new Table('users')) .merge({ status: 'inactive' }) .where('last_login < $date', { date: DateTime.parse('2024-01-01') });
const user = await db.update(new RecordId('users', 'john')) .merge({ profile: { bio: 'Updated bio', avatar: 'new-avatar.jpg' }, settings: { notifications: true, theme: 'dark' }, updated_at: DateTime.now() });
const diff = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com', age: 31 }) .output('DIFF'); console.log('Changed fields:', diff); // { email: 'new@example.com', age: 31 }
const updates = db.update(new Table('users')) .merge({ last_check: DateTime.now() }) .where('active = true'); for await (const user of updates.stream()) { console.log(`Updated user: ${user.id}`); }
.content() vs .merge() vs .replace()// CONTENT: Replaces entire record await db.update(recordId).content({ name: 'John', email: 'john@example.com' }); // Result: ONLY name and email exist, all other fields removed // MERGE: Updates specified fields only await db.update(recordId).merge({ email: 'john@example.com' }); // Result: Only email updated, all other fields preserved // REPLACE: Similar to merge but with different semantics await db.update(recordId).replace({ email: 'john@example.com' }); // Result: Replaces specified fields
const result = await db.update(new Table('users')) .merge({ status: 'active' }) .where('verified = true') .output('AFTER') .timeout(Duration.parse('5s'));