1

我正在尝试为我的 Sanity.io 项目运行 GROQ 查询,该查询应该过滤掉包含基于祖父母 ID 的引用的子文档。有可能这样做吗?

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

references(^._id)

但就我而言,我需要祖父母 ID,因此我无法像现在编写查询那样使用父运算符。

我也可以清楚地阅读文档:

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

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

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

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

在此先感谢,任何帮助都将不胜感激。

4

1 回答 1

2

非常简短的回答:您是正确的,因为目前在 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在每项运动下正确嵌套各种数据。

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

于 2019-07-29T13:40:41.720 回答