😎 Discover cool tips and tricks for customization in our next Developer Deep Dive virtual event - sign up now!

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– 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?