How to merge multiple documents into a single flat object in GROQ?
Great question! You want to merge multiple documents into a single flat object. In GROQ, you can achieve this using object spread syntax (...) combined with array indexing.
Here's the solution for your specific case:
{
...*[_type == "businessName"][0],
...*[_type == "contact"][0],
...*[_type == "address"][0]
}This query:
- Fetches each document type separately using
[0]to get the first (and only) document - Uses the spread operator
...to unpack all fields from each document - Combines them into a single flat object
The result will be exactly what you're looking for:
{
"businessName": "Example Business Name",
"email": "email@domain.com|email@domain.com",
"fax": "780-555-4444|780-555-4444",
"phone": "780-555-5555|780-555-5555",
"addressLine1": "123 Main Street",
"city": "Sometown",
"postal": "T8A 1A1",
"province": "AB"
}Alternative approach if you want to be more explicit about which fields to include:
{
"businessName": *[_type == "businessName"][0].businessName,
"email": *[_type == "contact"][0].email,
"fax": *[_type == "contact"][0].fax,
"phone": *[_type == "contact"][0].phone,
"addressLine1": *[_type == "address"][0].addressLine1,
"city": *[_type == "address"][0].city,
"postal": *[_type == "address"][0].postal,
"province": *[_type == "address"][0].province
}This second approach gives you more control over field naming and avoids accidentally including system fields like _id, _type, _createdAt, etc.
The spread operator approach is cleaner if you're confident about the field names not conflicting and you don't mind including all fields from each document!
Show original thread10 replies
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.