
Grab your gear: The official Sanity swag store
Read Grab your gear: The official Sanity swag storeGreat 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:
*[_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)*[_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"}
}
]
}*[_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.
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.
Content operations
Content backend


The only platform powering content operations
By Industry


Tecovas strengthens their customer connections
Build and Share

Grab your gear: The official Sanity swag store
Read Grab your gear: The official Sanity swag store