我正在尝试为Sanity.io项目运行GROQ查询,该查询应筛选出包含基于祖父母id的引用的子文档。有可能这样做吗?
我了解到,对于类似的情况,我可以像这样使用父运算符:
references(^._id)
但是在我的情况下,我需要祖父母id,所以我不能像现在编写查询那样使用父运算符。
我还可以清楚地阅读文档:
已知问题 ^运算子目前仅适用于子查询。在所有其他范围中,它返回当前范围的根,而不是父范围。也不可能使用^来引用祖父母范围。
但是没有有关解决方法的信息。
查询当前看起来像这样。我只需要引用团队ID的页面。但是现在,在当前位置(页面)使用 references(^ ._ id),我只能从父母(体育)那里获得参考ID,而从祖父母(团队)那里获取参考ID。我需要。
*[_type == 'client' && alias == 'ipsum']{
_id, name, teams[]->{
_id, name,
sports[]->{
name,
"pages": *[_type=='page' && references(^.id)]
}
}
}
在此先感谢您,所有帮助将不胜感激。
答案 0 :(得分:1)
非常简短的回答:您是正确的,因为目前无法在GROQ中引用祖父母。
但是,通常有一种方法可以绕开这些障碍。
如果您的架构不不包含Sport
和Page
之间的直接关系,则最好由团队汇总页面:
*[_type == 'client' && alias == 'ipsum']{
_id, name, teams[]->{
_id, name,
sports[]-> {_id, name},
"pages": *[_type=='page' && references(^._id)]
}
}
这将减少每次查询传输的数据量,因为您不再为每种运动举起相同的页面集。
如果您的架构确实包含Sport
和Page
之间的直接关系,例如someSport.page._ref
,那么以下查询将仅包含那些页面:
*[_type == 'client' && alias == 'ipsum']{
_id, name, teams[]->{
_id, name,
sports[]-> {
_id,
name,
"pageId": page._ref
},
"sportPages": *[_type=='page' && references(^._id) && _id in ^.sports[].page._ref]
}
}
在后一种情况下,您可能希望整理一些客户端数据,以使各种sportPages
正确嵌套在每种运动项下。
免责声明:我尚未在实际数据上进行过尝试,但是我希望上述查询可能是您使它起作用所需的灵感吗?