GROQ Query Joins - How to get the Name Value on a Reference
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.