Using GROQ to select from referenced values in Sanity.io
4 replies
Last updated: Jul 14, 2020
boiling this down to the simplest form, is there a way I can
select()from referenced values using GROQ?I have a reference which could refer to two possible document types. This query totally works – but it doesn’t seem like the “best” way to do it, and I’m not sure if there would be some unexpected behaviour outside of this isolated example, or in a more complicated case?
*[_type == "story" && !(_id in path('drafts.**'))] | order(publicationDate desc) {
"references": references[] {
"title": reference-> name,
"title": reference-> title,
}
}Jul 14, 2020, 8:59 AM
I was expecting to do something a bit like this:
*[_type == "story" && !(_id in path('drafts.**'))] | order(publicationDate desc) {
"references": references[] {
"title": select(
reference-> name => reference-> name,
reference-> title => reference-> title
)
}
}Jul 14, 2020, 9:04 AM
oh also … the shortcoming of doing it the first way, I guess is that unnecessary conditions are searched for, met or not met, then overwritten … whereas using select would cut at first case?
Jul 14, 2020, 9:07 AM
How about something like:
*[_type == "story" && !(_id in path('drafts.**'))] | order(publicationDate desc) {
"references": references[]->{
_type == "someType" => {
"title": name
},
_type == "otherType" => {
title
},
}
}Jul 14, 2020, 9:16 AM
oh amazing! thanks
user Z
. This is great – the second piece of the puzzle was checking if a property existed using defined()– having written this, I now feel like (probably falsely) like a certifiable GROQ wizard …
"references": references[] {
reference-> _type == "artist" => {
"title": reference-> name,
"slug": reference-> slug.current,
"image": select(
defined(reference-> artworks) => reference-> artworks[0]-> {
...image,
"type": "artwork",
"metadata": image.asset->metadata
},
defined(image) => image {
...,
"type": "override",
"metadata": asset->metadata
},
)
},
reference-> _type == "exhibition" => {
"title": reference-> title,
"slug": reference-> slug.current,
"image": select(
defined(image) => image {
...,
"type": "override",
"metadata": asset->metadata
},
defined(reference-> images) => reference-> images[0] {
...,
"type": "installation",
"metadata": asset->metadata
},
)
},
_type == "external" => {
"title": title,
link,
"image": image {
...,
"metadata": asset->metadata
}
},
_type == "pdf" => {
"title": title,
"file": file.asset->url,
"image": image {
...,
"metadata": asset->metadata
}
}
}Jul 14, 2020, 10:17 AM
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.

