Join us live Sept. 27 – How Sanity and Vercel powered Morning Brew's transformation –>

Are there some limitations on -> when nested like this?

13 replies
Last updated: Oct 23, 2020

OK, so I have a document that contains an array objects, and each object have a reference to another document. GROQ, exemplified with books:

*[_type == "collection"] {

"title": collection_title,

"books": collection_books[]{

"title": collection_book->book_title,

"persons": collection_book->persons[]{

"type": type,

"firstname": person->firstname

}

}

}

Problem here is that
person->firstname
doesn't return anything. If I just write
person
then _ref and _type is returned as expected, but -> doesn't seem to work. Are there some limitations on -> when nested like this?

Oct 18, 2020, 3:05 PM

Try

person->.firstname
and if they’re already named
type
and
firstname
you could try

{
  type,
  person->.firstname
}

Oct 18, 2020, 3:46 PM

Sorry, Theo, but doesn't help. But, thanks! type is returned correctly, as that is a value in the object, but person-> is a reference, and doesn't return anything.
If I use

person->.firstname
instead of
"firstname": person->.firstname
I get an error: "Must be an attribute or a string key".

Oct 18, 2020, 3:55 PM

try

"firstname": @->.firstname

Oct 19, 2020, 11:30 AM

@
denotes the current item in the array

Oct 19, 2020, 11:30 AM

@
denotes the current item in the array

Oct 19, 2020, 11:30 AM

Actually, it depends on your data structure, so an example document would help

Oct 19, 2020, 11:33 AM

try

"firstname": @->.firstname

Oct 19, 2020, 11:30 AM

I solved this particular case by rewriting the structure of the query to a more suitable format. Anyways, I ran into another case of the same:

 "files": collection_set->set_downloads[]{
        "comments": download_comments,
        "type": download_type,
        "url": download_file.asset->url
    },
comments and type works fine, but url returns nothing. I "hacked" it by doing some string replacements on
download_file.asset["_ref"]
instead, but should be fixed the correct way. Tried with @, but no luck. Some relevant schemas attached.

Oct 19, 2020, 5:55 PM

user J
☝️

Oct 22, 2020, 6:16 PM

That looks correct to me. Is it a public dataset? If so you could send me an http url with query and I could tinker with it to see if there's something we're missing

Oct 22, 2020, 6:43 PM

Sure! See PM. Thanks!

Oct 22, 2020, 6:55 PM

This seems to work, you get the extra

set_downloads
level, tho. But at least you get the url
*[_type == 'collection']{
  "files": collection_sets[]{
    ...@.collection_set->{
      set_downloads[]{
        "comments": download_comments,
        "type": download_type,
        "url": download_file.asset->url
      }
    }
  }
}

Oct 22, 2020, 7:14 PM

Thanks, this works!

Oct 23, 2020, 6:40 AM

Sanity.io: Get the most out of your content

Sanity.io is a platform to build websites and applications. It comes with great APIs that let you treat content like data. Give your team exactly what they need to edit and publish their content with the customizable Sanity Studio. Get real-time collaboration out of the box. Sanity.io comes with a hosted datastore for JSON documents, query languages like GROQ and GraphQL, CDNs, on-demand asset transformations, presentation agnostic rich text, plugins, and much more.

Don't compromise on developer experience. Join thousands of developers and trusted companies and power your content with Sanity.io. Free to get started, pay-as-you-go on all plans.