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
| Option | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
limit | number | Items per page (default: 10) |
sort | string | Sort order (-createdAt = descending) |
where | Where | Filter conditions (see Filtering) |
depth | number | Relationship query depth (0-10) |
select | Record<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
| Operation | Response |
|---|---|
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 } |