GROQ: Filter by referenced document ID in nested array projection
I can see the issue you're encountering. When you try to use references(subjectTag->_id) inside a projection, the dereferencing operation (->) happens in a different context, and you can't directly use it within the references() function like that.
The problem is that subjectTag->_id tries to dereference in the context of the outer document, but inside the nested query *[_type=='subject' && references(...)], you need the actual ID value, not a path expression.
Here are two solutions:
Solution 1: Store the ID in a variable first
_type == 'contentSubjectTag' => {
_type,
"title": subjectTag->title,
"text": subjectTag->text,
"subjectTagId": subjectTag->_id,
"subjects": *[_type=='subject' && references(^.subjectTagId)]{
title,
externalLink,
},
},By first storing subjectTag->_id as "subjectTagId", you create a field in the projected object. Then you can reference it using the parent operator (^) in your nested query.
Solution 2: Use the reference directly
If your subjectTag field is a reference (contains {_ref: "..."} structure), you can use the reference value directly:
_type == 'contentSubjectTag' => {
_type,
"title": subjectTag->title,
"text": subjectTag->text,
"subjects": *[_type=='subject' && references(^.subjectTag._ref)]{
title,
externalLink,
},
},Here, ^.subjectTag._ref accesses the _ref property of the reference object in the parent document.
The key insight is that the parent operator ^ lets you access fields from the outer document context when you're inside a nested query. You need to either:
- Pre-compute the dereferenced ID as a field, then reference it with
^(Solution 1) - Access the raw
_refvalue from the reference object using^(Solution 2)
Both approaches work around the limitation that you can't perform dereferencing operations directly inside the references() function parameter. The parent operator ^ is essential here because it allows your nested query to reach back up to the parent document's context and grab the value you need.
Show original thread6 replies
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.