01 Software

Query Builder

Supabase-style type-safe query builder

Query Builder

Access the per-collection query builder via the client.from(collection) method.

BrowserClient.from() returns a ReadOnlyQueryBuilder (read-only), while ServerClient.from() returns the full CollectionQueryBuilder (read + write).

Read Operations

find() - List Query

const { docs, totalDocs, hasNextPage } = await client.from('products').find({
  limit: 10,
  page: 1,
  sort: '-createdAt',
  where: { status: { equals: 'published' } },
  depth: 2,
  select: { title: true, slug: true },
})

Return type: PayloadFindResponse<T>

interface PayloadFindResponse<T> {
  docs: T[]
  totalDocs: number
  limit: number
  totalPages: number
  page: number
  hasNextPage: boolean
  hasPrevPage: boolean
  nextPage: number | null
  prevPage: number | null
}

findById() - Find by ID

const product = await client.from('products').findById('product_id')
// Returns: T (document object directly)

count() - Document Count

const { totalDocs } = await client.from('products').count({
  where: { status: { equals: 'active' } }
})

Write Operations

Write operations are only available on ServerClient.

create()

const { doc, message } = await serverClient.from('products').create({
  name: 'New Product',
  price: 10000,
})
// Returns: PayloadMutationResponse<T> { doc, message, errors? }

update()

const { doc } = await serverClient.from('products').update('product_id', {
  name: 'Updated Product Name',
})

remove()

const deleted = await serverClient.from('products').remove('product_id')
// Returns: T (deleted document)

updateMany() / removeMany()

await serverClient.from('products').updateMany(
  { status: { equals: 'draft' } },   // where
  { status: 'published' },            // data
)

await serverClient.from('products').removeMany(
  { status: { equals: 'archived' } }, // where
)

Query Options

OptionTypeDescription
pagenumberPage number (default: 1)
limitnumberItems per page (default: 10)
sortstringSort order (-createdAt = descending)
whereWhereFilter conditions (see Filtering)
depthnumberRelationship query depth (0-10)
selectRecord<string, boolean>Field selection

Metadata Query

Query SEO metadata. See the Metadata docs for details.

const metadata = await client.from('products').findMetadata(
  { where: { slug: { equals: 'my-product' } } },
  { siteName: 'My Store' },
)

const metadata = await client.from('products').findMetadataById('product_id')

Response Type Summary

OperationResponse
find()PayloadFindResponse<T> - { docs, totalDocs, hasNextPage, ... }
findById()T
findMetadata()Metadata | null
findMetadataById()Metadata
create()PayloadMutationResponse<T> - { doc, message }
update()PayloadMutationResponse<T> - { doc, message }
remove()T
count(){ totalDocs: number }

On this page