【问题标题】:Can I reach a grandparent from a GROQ query?我可以通过 GROQ 查询联系到祖父母吗?
【发布时间】:2019-11-14 23:22:47
【问题描述】:

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

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

references(^._id)

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

在文档中我也能看得很清楚:

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

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

查询当前如下所示。我只需要引用团队 ID 的页面。但是现在,使用当前位置(页面)中的 references(^._id) ,我只从父级(体育)而不是祖父级(团队)获取参考 id我需要。

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

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

【问题讨论】:

  • SportPage 之间的架构中是否存在任何关系?

标签: sanity groq


【解决方案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 正确嵌套在每项运动下。

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

【讨论】:

  • 非常感谢 thomax,这绝对激发了我的工作!
猜你喜欢
  • 2022-10-17
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多