我可以通过 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 中无法引用祖父母。

不过,通常有办法绕过这些障碍。

如果您的架构 包含 SportPage 之间的直接关系,您最好按团队聚合页面:

*[_type == 'client' && alias == 'ipsum']{
  _id, name, teams[]->{
    _id, name,
    sports[]-> {_id, name},
    "pages": *[_type=='page' && references(^._id)]
  }
}

这会减少每次查询传输的数据量,因为您不再需要为每项运动提取一组相同的页面。

如果您的架构 确实 包含 SportPage 之间的直接关系,例如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

免责声明:我还没有在实际数据上进行过尝试,但我希望上述查询可能是您需要的灵感来让它发挥作用?