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 type

  • I - The input type for record data

  • J - Boolean indicating if result is JSON (default: false)

Replace the entire record content with new data.

Method Syntax

updatePromise.content(data)
ParameterTypeDescription
data 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 partial updates into the existing record.

Method Syntax

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

UpdatePromise<T, I, J> - Chainable promise

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 specific fields while keeping others unchanged.

Method Syntax

updatePromise.replace(data)
ParameterTypeDescription
data Values<I>Fields to replace.

UpdatePromise<T, I, J> - Chainable promise

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

Apply JSON Patch operations to update the record.

Method Syntax

updatePromise.patch(operations)
ParameterTypeDescription
operations 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' }
]);

Add a WHERE clause to conditionally update records.

Method Syntax

updatePromise.where(condition)
ParameterTypeDescription
condition ExprLikeThe condition expression (string or Expression object).

UpdatePromise<T, I, J> - Chainable promise

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

Specify what to return from the update operation.

Method Syntax

updatePromise.output(fields)
ParameterTypeDescription
fields Output"NONE", "BEFORE", "AFTER", "DIFF", or field list.

UpdatePromise<T, I, J> - Chainable promise

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

Set a timeout for the operation.

Method Syntax

updatePromise.timeout(duration)
ParameterTypeDescription
duration DurationMaximum time to wait.

UpdatePromise<T, I, J> - Chainable promise

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

Method Syntax

updatePromise.version(timestamp)
ParameterTypeDescription
timestamp DateTimeThe version timestamp.

UpdatePromise<T, I, J> - Chainable promise

Return result as JSON string.

Method Syntax

updatePromise.json()

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

Stream results as they arrive.

Method Syntax

updatePromise.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: 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'));

Was this page helpful?