Setting Up GROQ Queries for Sanity
GROQ (Graph-Relational Object Queries) is Sanity's query language. Not REST, not SQL, not GraphQL. More flexible than REST for complex structures: projections, join via ->, conditional selections, aggregations — all in one query without N+1 problems.
Basic Syntax
// All post documents
*[_type == "post"]
// With condition
*[_type == "post" && status == "published"]
// Sorting and pagination
*[_type == "post"] | order(publishedAt desc) [0...10]
// Projection — select specific fields
*[_type == "post"] {
_id,
title,
"slug": slug.current,
publishedAt
}
Resolve (join via ->)
// Fill related documents
*[_type == "post"] {
title,
"author": author->{ name, avatar },
"categories": categories[]->{ title }
}
Conditional Projections
// Different fields based on _type (for dynamic zones)
*[_type == "page"] {
title,
"sections": sections[] {
_type,
_type == "hero" => { heading, image },
_type == "textBlock" => { content }
}
}
Parameterized Queries
const query = `*[_type == "post" && slug.current == $slug][0] { title }`
const post = await client.fetch(query, { slug: 'my-post' })
Aggregations
// Count published articles
count(*[_type == "post" && status == "published"])
// Unique values
array::unique(*[_type == "post"].status)
Full Text Search
*[_type == "post" && [title, pt::text(body)] match $q]
Timeline
Development of GROQ queries for 4–6 page types — 1–2 days.







