plain equality
{ status: "done" }
json_extract(_doc, '$.status') = ?
q.eq
{ priority: q.eq("high") }
json_extract(_doc, '$.priority') = ?
q.ne
{ status: q.ne("archived") }
json_extract(_doc, '$.status') != ?
q.oneOf
{ status: q.oneOf(["done", "reviewing"]) }
json_extract(_doc, '$.status') IN (?, ?)
q.notOneOf
{ status: q.notOneOf(["archived", "deleted"]) }
json_extract(_doc, '$.status') NOT IN (?, ?)
q.gt
{ score: q.gt(80) }
json_extract(_doc, '$.score') > ?
q.gte
{ progress: q.gte(50) }
json_extract(_doc, '$.progress') >= ?
q.lt
{ retryCount: q.lt(3) }
json_extract(_doc, '$.retryCount') < ?
q.lte
{ dueAt: q.lte(to) }
json_extract(_doc, '$.dueAt') <= ?
q.between
{ updatedAt: q.between(from, to) }
json_extract(_doc, '$.updatedAt') BETWEEN ? AND ?
q.exists
q.exists("assignee")
json_type(_doc, '$.assignee') IS NOT NULL
q.missing
q.missing("deletedAt")
json_type(_doc, '$.deletedAt') IS NULL
q.empty
q.empty("removedAt")
json_extract(_doc, '$.removedAt') IS NULL OR json_extract(_doc, '$.removedAt') = ''
q.has
{ tags: q.has("urgent") }
EXISTS (SELECT 1 FROM json_each(json_extract(_doc, '$.tags')) WHERE value = ?)
q.contains
{ title: q.contains("release") }
json_extract(_doc, '$.title') LIKE ?
q.all
q.all({ project }, { status: "active" })
(json_extract(_doc, '$.project') = ?) AND (json_extract(_doc, '$.status') = ?)
q.any
q.any({ status: "done" }, { status: "reviewing" })
(json_extract(_doc, '$.status') = ?) OR (json_extract(_doc, '$.status') = ?)
q.not
q.not({ status: "archived" })
NOT (json_extract(_doc, '$.status') = ?)
q.when true
q.when(userIds.length, { user: q.oneOf(userIds) })
json_extract(_doc, '$.user') IN (?, ...)
q.when false
q.when(false, { user })
1 = 1
nested path
{ "profile.city": "Seoul" }
json_extract(_doc, '$.profile.city') = ?
array field
{ watchers: q.has(userId) }
EXISTS (SELECT 1 FROM json_each(json_extract(_doc, '$.watchers')) WHERE value = ?)
q.raw
q.raw("json_extract(_doc, '$.score') > ?", [minScore])
(json_extract(_doc, '$.score') > ?)