RecordId<Tb, Id>The RecordId class provides type-safe record identifiers in SurrealDB. Each record ID consists of a table name and an ID value, represented as table:id in SurrealQL.
Import:
import { RecordId } from 'surrealdb' ; Source: value/record-id.ts
Type Parameters Tb extends string - The table name (string literal type for type safety)
Id - The ID value type (string, number, object, etc.)
Constructor new RecordId(table, id, validate?)Create a new record identifier.
new RecordId ( table , id , validate ? ) Parameters Parameter Type Description table TbThe table name. id IdThe record ID value (string, number, object, array, or RecordId). validate booleanWhether to validate the table name format (default: true).
Examples // String IDs const user = new RecordId ( 'users' , 'john' ) ; const post = new RecordId ( 'posts' , '123' ) ; // Numeric IDs const product = new RecordId ( 'products' , 42 ) ; // Complex/structured IDs const metric = new RecordId ( 'metrics' , { service : 'api' , timestamp : 1234567890 } ) ; // Array IDs const compound = new RecordId ( 'items' , [ 'type-a' , 123 ] ) ; // Nested RecordId const nested = new RecordId ( 'links' , new RecordId ( 'users' , 'alice' ) ) ; // Type-safe with generics const typedUser = new RecordId < 'users' , string > ( 'users' , 'john' ) ; Properties tbThe table name component.
Type: Tb
const userId = new RecordId ( 'users' , 'john' ) ; console . log ( userId . tb ) ; // 'users'
idThe ID value component.
Type: Id
const userId = new RecordId ( 'users' , 'john' ) ; console . log ( userId . id ) ; // 'john' const productId = new RecordId ( 'products' , 42 ) ; console . log ( productId . id ) ; // 42 Static Methods RecordId.parse(string)Parse a record ID from its string representation.
Parameters Parameter Type Description str stringThe record ID string (format: table:id).
Returns RecordId - The parsed record ID
Examples // Parse simple IDs const user = RecordId . parse ( 'users:john' ) ; const post = RecordId . parse ( 'posts:123' ) ; // Parse complex IDs const metric = RecordId . parse ( 'metrics:{ service: "api", time: 1234567890 }' ) ; // Use in queries const userId = RecordId . parse ( 'users:alice' ) ; const user = await db . select ( userId ) ;
RecordId.from(value)Create a record ID from various value types.
Parameters Parameter Type Description value unknownValue to convert to RecordId.
Returns RecordId | undefined - The record ID or undefined if conversion fails
const rid = RecordId . from ( 'users:john' ) ; const same = RecordId . from ( new RecordId ( 'users' , 'john' ) ) ; Instance Methods .toString()Convert the record ID to its string representation.
Returns string - String representation in format table:id
Examples const userId = new RecordId ( 'users' , 'john' ) ; console . log ( userId . toString ( ) ) ; // 'users:john' const productId = new RecordId ( 'products' , 42 ) ; console . log ( productId . toString ( ) ) ; // 'products:42' const complex = new RecordId ( 'items' , { type : 'widget' , id : 5 } ) ; console . log ( complex . toString ( ) ) ; // 'items:{ type: "widget", id: 5 }'
.toJSON()Serialize the record ID for JSON.
Returns string - JSON-safe string representation
const userId = new RecordId ( 'users' , 'john' ) ; console . log ( JSON . stringify ( userId ) ) ; // '"users:john"'
.equals(other)Check if two record IDs are equal.
Parameters Parameter Type Description other unknownValue to compare.
Returns boolean - True if equal
const a = new RecordId ( 'users' , 'john' ) ; const b = new RecordId ( 'users' , 'john' ) ; const c = new RecordId ( 'users' , 'jane' ) ; console . log ( a . equals ( b ) ) ; // true console . log ( a . equals ( c ) ) ; // false Complete Examples Basic Usage import { Surreal , RecordId } from 'surrealdb' ; const db = new Surreal ( ) ; await db . connect ( 'ws://localhost:8000' ) ; // Create record with specific ID const user = await db . create ( new RecordId ( 'users' , 'john' ) ) . content ( { name : 'John Doe' , email : 'john@example.com' } ) ; // Select by record ID const retrieved = await db . select ( new RecordId ( 'users' , 'john' ) ) ; // Update by record ID await db . update ( new RecordId ( 'users' , 'john' ) ) . merge ( { status : 'active' } ) ; // Delete by record ID await db . delete ( new RecordId ( 'users' , 'john' ) ) ; Type-Safe Record IDs interface User { id : RecordId < 'users' , string > ; name : string ; email : string ; } // TypeScript enforces correct table name const userId : RecordId < 'users' , string > = new RecordId ( 'users' , 'alice' ) ; // This would be a type error: // const wrong: RecordId<'posts', string> = new RecordId('users', 'alice'); const user = await db . select < User > ( userId ) ; Complex ID Structures // Time-series data with structured IDs const metricId = new RecordId ( 'metrics' , { service : 'api' , host : 'server-01' , timestamp : 1234567890 } ) ; await db . create ( metricId ) . content ( { cpu : 45.2 , memory : 78.1 } ) ; // Compound keys const sessionId = new RecordId ( 'sessions' , { userId : 'john' , deviceId : 'device-123' } ) ; Parsing from Strings // Parse user input const userInput = 'users:john' ; const userId = RecordId . parse ( userInput ) ; const user = await db . select ( userId ) ; // Parse from query results const result = await db . query ( 'SELECT id FROM users:john' ) . collect ( ) ; const recordId = RecordId . parse ( result [ 0 ] . id ) ; Working with Relations // Create relationship using record IDs const from = new RecordId ( 'users' , 'john' ) ; const to = new RecordId ( 'posts' , '123' ) ; const edge = await db . relate ( from , new Table ( 'likes' ) , to , { timestamp : DateTime . now ( ) } ) ; console . log ( 'Edge from:' , edge . in ) ; // RecordId('users', 'john') console . log ( 'Edge to:' , edge . out ) ; // RecordId('posts', '123') UUID-based Record IDs import { Uuid } from 'surrealdb' ; // Generate time-ordered IDs const userId = new RecordId ( 'users' , Uuid . v7 ( ) ) ; // Generate random IDs const sessionId = new RecordId ( 'sessions' , Uuid . v4 ( ) ) ; await db . create ( userId ) . content ( { name : 'Alice' , created : DateTime . now ( ) } ) ; Validation // Validate table names (enabled by default) try { const invalid = new RecordId ( 'invalid-table!' , 'id' ) ; } catch ( error ) { console . error ( 'Invalid table name' ) ; } // Skip validation const unvalidated = new RecordId ( 'any-name' , 'id' , false ) ; RecordIdRange The RecordIdRange class represents a range of record IDs for querying multiple records.
Constructor new RecordIdRange ( table , begin , end ) Parameters Parameter Type Description table stringThe table name. begin string | number | RecordIdStart of the range (inclusive). end string | number | RecordIdEnd of the range (exclusive).
Examples import { RecordIdRange } from 'surrealdb' ; // Select range of users from 'a' to 'f' const range = new RecordIdRange ( 'users' , 'a' , 'f' ) ; const users = await db . select ( range ) ; // Numeric range const numRange = new RecordIdRange ( 'items' , 1 , 100 ) ; const items = await db . select ( numRange ) ; // Update range await db . update ( new RecordIdRange ( 'users' , 'a' , 'f' ) ) . merge ( { verified : true } ) ; // Delete range await db . delete ( new RecordIdRange ( 'logs' , '2024-01-01' , '2024-02-01' ) ) ; Best Practices 1. Use Type Parameters // Good: Type-safe type UserId = RecordId < 'users' , string > ; const userId : UserId = new RecordId ( 'users' , 'john' ) ; // Better: Enforce at compile time function getUser ( id : RecordId < 'users' , string > ) { return db . select ( id ) ; } 2. Prefer RecordId Over Strings // Good: Type-safe with validation const user = await db . select ( new RecordId ( 'users' , 'john' ) ) ; // Avoid: String-based (no validation) const user = await db . query ( 'SELECT * FROM users:john' ) . collect ( ) ; 3. Use Structured IDs for Complex Keys // Good: Structured composite key const id = new RecordId ( 'events' , { userId : 'john' , timestamp : Date . now ( ) } ) ; // Avoid: String concatenation const id = new RecordId ( 'events' , `john- ${ Date . now ( ) } ` ) ; 4. Handle Parsing Errors // Good: Safe parsing try { const id = RecordId . parse ( userInput ) ; const record = await db . select ( id ) ; } catch ( error ) { console . error ( 'Invalid record ID format' ) ; } See Also