SurrealDB
SurrealDB Docs Logo

Enter a search query

Navigation

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

Type Parameters

  • T - The result type
  • I - The input type for record data
  • J - Boolean indicating if result is JSON (default: false)

Configuration Methods

.content()

Replace the entire record content with new data.

Method Syntax
updatePromise.content(data)

Parameters

ParameterTypeDescription
data requiredValues<I>Complete replacement data (excluding id field).

Returns

UpdatePromise<T, I, J> - Chainable promise

Example

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 Syntax
updatePromise.merge(data)

Parameters

ParameterTypeDescription
data requiredPartial<Values<I>>Partial data to merge (only specified fields are updated).

Returns

UpdatePromise<T, I, J> - Chainable promise

Examples

Update Single Field
const user = await db.update(new RecordId('users', 'john')) .merge({ email: 'newemail@example.com' }); // Only updates email, other fields unchanged
Update Multiple Fields
const 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 Syntax
updatePromise.replace(data)

Parameters

ParameterTypeDescription
data requiredValues<I>Fields to replace.

Returns

UpdatePromise<T, I, J> - Chainable promise

Example

const user = await db.update(new RecordId('users', 'john'))
    .replace({ status: 'inactive' });

.patch()

Apply JSON Patch operations to update the record.

Method Syntax
updatePromise.patch(operations)

Parameters

ParameterTypeDescription
operations requiredPatchOperation[]JSON Patch operations to apply.

Returns

UpdatePromise<T, I, J> - Chainable promise

Example

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 Syntax
updatePromise.where(condition)

Parameters

ParameterTypeDescription
condition requiredExprLikeThe condition expression (string or Expression object).

Returns

UpdatePromise<T, I, J> - Chainable promise

Examples

Conditional Update
const users = await db.update(new Table('users')) .merge({ verified: true }) .where('email_confirmed = true');
With Expression Builder
import { 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 Syntax
updatePromise.output(fields)

Parameters

ParameterTypeDescription
fields requiredOutput”NONE”, “BEFORE”, “AFTER”, “DIFF”, or field list.

Returns

UpdatePromise<T, I, J> - Chainable promise

Examples

Return Updated Record
const user = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com' }) .output('AFTER'); // Returns the record after update
Return Only Changed Fields
const diff = await db.update(new RecordId('users', 'john')) .merge({ email: 'new@example.com' }) .output('DIFF'); // Returns only the changed fields
Return Original Record
const 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 Syntax
updatePromise.timeout(duration)

Parameters

ParameterTypeDescription
duration requiredDurationMaximum time to wait.

Returns

UpdatePromise<T, I, J> - Chainable promise


.version()

Update at a specific version (for versioned storage engines).

Method Syntax
updatePromise.version(timestamp)

Parameters

ParameterTypeDescription
timestamp requiredDateTimeThe version timestamp.

Returns

UpdatePromise<T, I, J> - Chainable promise


.json()

Return result as JSON string.

Method Syntax
updatePromise.json()

Returns

UpdatePromise<T, I, true> - Promise returning JSON string


.stream()

Stream results as they arrive.

Method Syntax
updatePromise.stream()

Returns

AsyncIterableIterator - Async iterator

Complete Examples

Basic Updates

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' });

Bulk Updates

// 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`);

Conditional Updates

// 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') });

Complex Merge

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() });

Tracking Changes

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 }

Batch Update with Stream

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}`); }

Difference Between Methods

.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

Chaining Pattern

const result = await db.update(new Table('users')) .merge({ status: 'active' }) .where('verified = true') .output('AFTER') .timeout(Duration.parse('5s'));

See Also