You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单次查询中填充Page类型的嵌套引用数组?

如何在Sanity中查询Page并填充嵌套的tile引用数据

嘿,这事儿用Sanity的GROQ查询就能搞定,核心是用->操作符来展开引用——因为你的tile嵌套在两层数组里(page.blocks[] → tileGrid.tiles[]),所以需要逐层处理引用展开。

我给你写个完整的查询示例,再拆解说明细节:

// 获取所有Page文档,也可以加过滤条件(比如slug)指定单个页面
*[_type == "page"] {
  // 先获取Page本身的基础字段
  title,
  // 遍历blocks数组,逐个处理每个block
  blocks[] {
    // 保留每个block的类型标识,方便前端区分渲染
    _type,
    // 只针对tileGrid类型的block,展开它的tiles引用
    _type == "tileGrid" => {
      // 对tiles数组里的每个tile引用,用->拉取完整的tile文档数据
      tiles[]->{
        // 这里可以列出你需要的tile字段,或者用...获取所有字段
        ...,
        // 如果tile还有其他嵌套引用(比如image是asset引用),也可以继续展开
        // image->asset->url
      }
    },
    // 其他类型的block(比如你说的otherType)直接保留所有原字段
    _type != "tileGrid" => {
      ...
    }
  }
}

关键细节说明:

  • ->操作符:这是GROQ里展开引用的核心,它会把仅含_ref和_type的引用对象,替换成完整的目标文档数据。
  • 条件判断:用_type == "tileGrid"精准处理特定类型的block,避免破坏其他类型blocks的数据结构。
  • 字段控制:如果不需要tile的所有字段,可以明确列出需要的字段(比如_id, title, description),减少返回数据量、提升性能。
  • 单个页面查询:如果要查询特定页面,只需在过滤条件里加上slug判断,比如:
    *[_type == "page" && slug.current == "about-us"] {
      // 后续结构和上面一致
    }
    

举个更具体的场景:假设你的tile有title、description和image字段,查询可以写成:

*[_type == "page"] {
  title,
  blocks[] {
    _type,
    _type == "tileGrid" => {
      tiles[]->{
        _id,
        title,
        description,
        image
      }
    },
    ...
  }
}

这样返回的Page数据里,blocks数组中所有tileGrid类型的元素,其tiles数组都会是完整的tile文档数据,而不是单纯的引用对象了。

内容的提问来源于stack exchange,提问作者Slem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:24:44