Merging locale documents with GROQ fallback values

10 repliesLast updated: Nov 29, 2025

hey, anyone know if it’s possible to merge documents with GROQ? use case is merging separate locale documents onto the main/fallback locale, so for example if we had an EN and DE document any DE fields with values would be merged into the EN but anything missing from DE would just have the EN values
AI Update

Yes, you can definitely merge documents with GROQ! For your locale merging use case, you'll want to use the object spread operator (...) combined with coalesce() to handle fallbacks.

Here's the basic pattern for merging a DE locale document onto an EN fallback:

*[_id == $documentId][0] {
  ...,
  "title": coalesce(^[_id == $documentId + ".de"][0].title, title),
  "description": coalesce(^[_id == $documentId + ".de"][0].description, description)
}

But a cleaner approach is to fetch both documents and merge them in the projection:

{
  "en": *[_id == "en-doc"][0],
  "de": *[_id == "de-doc"][0]
} | {
  ...en,
  ...select(defined(de) => de)
}

Or for a more complete solution that merges all fields automatically:

*[_id == "en-doc"][0] {
  ...,
  ...coalesce(*[_id == "de-doc"][0], {})
}

The key operators you'll use:

The spread operator is documented in the GROQ operators spec, and you can read more about coalesce() in the GROQ functions documentation.

This approach keeps your query logic clean and handles missing fields gracefully by falling back to your EN values automatically.

Show original thread
10 replies

Was this answer helpful?

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.

Related contributions