我可以通过GROQ查询与祖父母联系吗?

时间:2019-07-04 08:56:03

标签: sanity groq

我正在尝试为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)]
        }
    }
}

在此先感谢您,所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

免责声明:我尚未在实际数据上进行过尝试,但是我希望上述查询可能是您使它起作用所需的灵感吗?