Sanity GROQ查询异常:仅返回en-US页面,移除对应条件后恢复正常
问题排查与解决方案
你的问题核心是查询结果中en-US语言的文档被优先选中,导致即使传入其他lang值,[0]始终取到en-US的条目。原因是当前查询会同时返回符合en-US和目标语言的文档(若两者都存在),而数组的第一个元素默认按Sanity内部排序规则(通常是文档创建时间升序,旧文档在前)返回,en-US的文档恰好排在前面。
修复方案
调整查询逻辑,优先匹配目标语言,仅当目标语言文档不存在时才回退到en-US:
方案1:通过排序优先展示目标语言文档
*[ _type == 'pages' && slug.current == "${slug}" && isHidden != true ] | order(language == "${lang}" desc)[0]
方案2:先查询目标语言,不存在则 fallback 到en-US
*[ _type == 'pages' && language == "${lang}" && slug.current == "${slug}" && isHidden != true ][0] ?? *[ _type == 'pages' && language == 'en-US' && slug.current == "${slug}" && isHidden != true ][0]
原查询问题解析
原查询(language == 'en-US' || language == "${lang}")会同时拉取两种语言的匹配文档(若都存在),而[0]仅取结果数组的第一个元素。如果en-US的文档创建时间更早,就会被优先返回,直接覆盖了目标语言的查询结果。
内容的提问来源于stack exchange,提问作者shubham tarpara
相关产品推荐
相关产品推荐

