Schema Types
The .grab
and .grabOne
methods are used to "project" and select certain values from documents, and these are the methods that dictate the shape of the resulting schema/data. To indicate what type specific fields should be, we use schemas provided by the groqd
library, such as q.string
, q.number
, q.boolean
, and so on.
For example:
q("*")
.filter("_type == 'pokemon'")
.grab({
// string field
name: q.string(),
// number field
hp: ["base.HP", q.number()],
// boolean field
isStrong: ["base.Attack > 50", q.boolean()],
});
The available schema types are shown below.
q.string
Corresponds to Zod's string type.
q.number
Corresponds to Zod's number type.
q.boolean
Corresponds to Zod's boolean type.
q.literal
Corresponds to Zod's literal type.
q.union
Corresponds to Zod's union type.
q.date
A custom Zod schema that can accept Date
instances or a date string (and it will transform that date string to a Date
instance).
Date objects are not serializable, so you might end up with a data object that can't be immediately serialized – potentially a problem if using groqd
in e.g. a Next.js backend data fetch.
q.null
Corresponds to Zod's null type.
q.undefined
Corresponds to Zod's undefined type.
q.array
Corresponds to Zod's array type.
q.object
Corresponds to Zod's object type.
q.slug
A convenience schema to easily grab a slug. Takes a single argument, which is the name of the slug field.
q("*")
.filterByType("blogPost")
.grab({
// 👇 slug schema
slug: q.slug("slug"),
// equivalent to...
slug: ["slug.current", q.string()]
});
q.contentBlock
A custom Zod schema to match Sanity's block
type, helpful for fetching data from a field that uses Sanity's block editor. For example:
q("*")
.filter("_type == 'user'")
.grab({ body: q.array(q.contentBlock()) });
Pass an object of the shape { markDefs: z.ZodType }
to q.contentBlock
to specify custom markdef types, useful if you have custom markdefs, e.g.:
q("*")
.filter("_type == 'user'")
.grab({
body: q.array(q.contentBlock({
markDefs: q.object({ _type: q.literal("link"), href: q.string() })
}))
});
q.contentBlocks
q.contentBlocks
, a custom Zod schema, to match a list of q.contentBlock
's. Pass an argument of the shape { markDefs: z.ZodType }
to specify custom markdef types.
q("*")
.filter("_type == 'user'")
.grab({ body: q.contentBlocks() });