Query Operators
Complete guide to Kadak filter operators, special keys, and their SQL equivalents.
Query Operators
Kadak keeps the base path simple:
await db.users.findMany({ isActive: true, $limit: 50 })When needed, use operators for advanced filtering.
Core filter rules
- Top-level object =
WHEREfilter. - Multiple fields at top level are
AND. $orcreates groupedORconditions.$limitmaps toLIMIT.$ordermaps toORDER BY.
Equality and NULL
await db.users.findMany({ age: 18 })
await db.users.findMany({ deletedAt: null })SQL equivalent:
age = 18deleted_at IS NULL
Comparison operators
await db.users.findMany({
age: { $gt: 18, $lte: 65 },
})SQL equivalent:
age > 18age <= 65
Supported:
$gt$gte$lt$lte
IN operator
await db.users.findMany({
email: { $in: ['a@example.com', 'b@example.com'] },
})SQL equivalent:
email IN ('a@example.com', 'b@example.com')
Arrays also map to IN:
await db.users.findMany({ id: [1, 2, 3] })OR groups
await db.users.findMany({
$or: [{ role: 'admin' }, { isActive: true }],
$limit: 50,
})SQL equivalent:
(role = 'admin' OR is_active = true)
Ordering
await db.users.findMany({
isActive: true,
$order: { createdAt: 'desc', id: 'asc' },
$limit: 50,
})SQL equivalent:
ORDER BY created_at DESC, id ASC
Full example
await db.users.findMany({
age: { $gte: 18, $lt: 65 },
deletedAt: null,
$or: [{ role: 'admin' }, { role: 'owner' }],
$order: { createdAt: 'desc' },
$limit: 100,
})Notes
- Kadak auto-maps camelCase fields to snake_case SQL columns by default.
- Use
$limiton list queries for predictable performance. - For unsupported patterns, use
db.sqlas escape hatch.