How to dereference and get name from companyType reference in Sanity query
Great question! The syntax can definitely be confusing at first, but once you get it, it's really powerful. You're on the right track - you want to "dereference" those references to get the actual data.
The key is the arrow operator (->) in GROQ. This operator follows a reference and fetches the actual document data. Here's how to solve your specific problem:
For a single company with its type name:
*[_type == "company" && _id == "a832b6ff-9922-486a-842a-f59a35917323"]{
name,
companyPhone,
companyType[]->{
name
}
}The companyType[]-> syntax does two things:
[]- iterates through the array of references->- dereferences each reference to get the actual companyType document{name}- projects only the fields you want (in this case, just the name)
For all companies with their type names:
*[_type == "company"]{
name,
companyPhone,
companyUrl,
description,
visible,
companyType[]->{
name,
slug
}
}This will give you results like:
{
"name": "Shoppy Shop",
"companyPhone": "01322779068",
"companyType": [
{
"name": "Energy",
"slug": {"current": "energy"}
}
]
}If you just want the names as a flat array:
*[_type == "company"]{
name,
"companyTypeNames": companyType[]->name
}This gives you:
{
"name": "Shoppy Shop",
"companyTypeNames": ["Energy"]
}The reference access operator (->) documentation explains that it internally executes a subquery to fetch the referenced document by matching the _ref value to the _id of the target document - exactly what you described wanting to do!
Think of -> as saying "go fetch the document this reference points to" - it's GROQ's way of doing joins.
Show original thread1 reply
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.