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

如何让Sanity GROQ查询按指定ID数组顺序返回页面?

解决GROQ查询结果与ID数组顺序不一致的问题

问题原因

使用_id in [...]过滤文档时,GROQ只会返回匹配的文档,但不会保留你输入的ID数组的顺序——返回结果的顺序由数据库默认的存储或索引规则决定,和输入数组的顺序无关。

解决方案

通过order()函数结合indexOf(),让结果根据ID在目标数组中的索引位置排序,就能完全匹配你输入的顺序。修改后的查询如下:

*[_type == "page" && _id in ["ea62b903-cbf9-4c47-90b4-a893aecf276e","77eeb0e8-0368-420b-abfa-a8773d064a8c","cb81057d-db1e-4127-bc97-5e3b81aead7d","90bfad56-6396-471e-9db8-2a45f3ff6a79"]]
| order(indexOf(["ea62b903-cbf9-4c47-90b4-a893aecf276e","77eeb0e8-0368-420b-abfa-a8773d064a8c","cb81057d-db1e-4127-bc97-5e3b81aead7d","90bfad56-6396-471e-9db8-2a45f3ff6a79"], _id))

原理说明

  • indexOf(targetArray, _id)会返回当前文档的_id在目标数组中的位置索引(比如第一个ID的索引是0,第二个是1,以此类推)
  • order()函数基于这个索引值进行升序排序,最终返回的文档顺序就会和你输入的ID数组完全一致

如果你的ID数组是通过变量传入的,用变量写法会更简洁:

*[_type == "page" && _id in $idArray] | order(indexOf($idArray, _id))

只需在执行查询时传入idArray变量即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:55:03