Sanity 我可以通过GROQ查询找到祖父母吗?

Sanity 我可以通过GROQ查询找到祖父母吗?,sanity,groq,Sanity,Groq,我正在尝试为我的Sanity.io项目运行一个GROQ查询,该查询应该筛选出包含基于祖父母id的引用的子文档。是否可以这样做 我已经了解到,对于类似的场景,我可以像这样使用父操作符: references(^._id) 但在我的例子中,我需要祖父母id,因此我不能像现在编写查询的方式那样使用父操作符 我还可以在文档中清楚地阅读: 已知问题 ^运算符当前仅适用于子查询。在所有其他作用域中,它返回当前作用域的根,而不是父作用域。也不能使用^引用祖父母作用域 但没有关于解决方法的信息 查询当前看起来

我正在尝试为我的Sanity.io项目运行一个GROQ查询,该查询应该筛选出包含基于祖父母id的引用的子文档。是否可以这样做

我已经了解到,对于类似的场景,我可以像这样使用父操作符:

references(^._id)
但在我的例子中,我需要祖父母id,因此我不能像现在编写查询的方式那样使用父操作符

我还可以在文档中清楚地阅读:

已知问题 ^运算符当前仅适用于子查询。在所有其他作用域中,它返回当前作用域的根,而不是父作用域。也不能使用^引用祖父母作用域

但没有关于解决方法的信息

查询当前看起来像这样。我只需要引用团队id的页面。但是现在,使用当前位置(页面)中的引用(^.\u id),我只从父母(体育)而不是我需要的祖父母(团队)那里获得引用id

*[_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.\u 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
正确嵌套在每个sport下


免责声明:我还没有在实际数据上尝试过这一点,但我希望上面的查询可能是让它工作所需的灵感?

在你的模式中,
Sport
Page
之间有什么关系吗?非常感谢thomax,这确实激发了我工作的灵感!