✨Discover storytelling in the AI age with Pixar's Matthew Luhn at Sanity Connect, May 8th—register now

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.

Was this answer helpful?