我可以通过 GROQ 查询联系祖父母吗?
Can I reach a grandparent from a GROQ query?
我正在尝试 运行 我的 Sanity.io 项目的 GROQ 查询应该过滤掉 child 包含基于 grandparents id 的引用的文档.可以这样做吗?
我了解到,对于类似的场景,我可以像这样使用 parent 运算符:
references(^._id)
但在我的例子中,我需要 grandparent id,所以我不能像现在编写查询那样使用 parent 运算符。
我在文档中也能清楚的看到:
已知问题
^ 运算符目前仅适用于子查询。在所有其他作用域中,它 returns 当前作用域的根,而不是 parent 作用域。也不可能使用 ^ 来引用 grandparent 作用域。
但没有关于解决方法的信息。
查询当前看起来像这样。我只需要引用团队 ID 的页面。但是现在,在当前位置(页面)使用 references(^._id),我只能从 parent(体育)获得参考 ID,而不是来自我需要的盛大parent(团队)。
*[_type == 'client' && alias == 'ipsum']{
_id, name, teams[]->{
_id, name,
sports[]->{
name,
"pages": *[_type=='page' && references(^.id)]
}
}
}
在此先致谢,如有任何帮助,我们将不胜感激。
非常简短的回答:您是正确的,因为目前在 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
。
免责声明:我还没有在实际数据上进行过尝试,但我希望上述查询可能是您需要的灵感来让它发挥作用?
我正在尝试 运行 我的 Sanity.io 项目的 GROQ 查询应该过滤掉 child 包含基于 grandparents id 的引用的文档.可以这样做吗?
我了解到,对于类似的场景,我可以像这样使用 parent 运算符:
references(^._id)
但在我的例子中,我需要 grandparent id,所以我不能像现在编写查询那样使用 parent 运算符。
我在文档中也能清楚的看到:
已知问题 ^ 运算符目前仅适用于子查询。在所有其他作用域中,它 returns 当前作用域的根,而不是 parent 作用域。也不可能使用 ^ 来引用 grandparent 作用域。
但没有关于解决方法的信息。
查询当前看起来像这样。我只需要引用团队 ID 的页面。但是现在,在当前位置(页面)使用 references(^._id),我只能从 parent(体育)获得参考 ID,而不是来自我需要的盛大parent(团队)。
*[_type == 'client' && alias == 'ipsum']{
_id, name, teams[]->{
_id, name,
sports[]->{
name,
"pages": *[_type=='page' && references(^.id)]
}
}
}
在此先致谢,如有任何帮助,我们将不胜感激。
非常简短的回答:您是正确的,因为目前在 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
。
免责声明:我还没有在实际数据上进行过尝试,但我希望上述查询可能是您需要的灵感来让它发挥作用?