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 remarkable experiences at scale
Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.