Sanity GROQ如何按引用字段值对查询结果排序
GROQ实现按关联最新fact排序celeb列表
核心查询语句
你可以通过子查询拉取每个celeb关联的最新fact更新时间,将该字段作为排序依据即可实现需求,可直接使用的GROQ语句如下:
*[_type == "celeb"]{ // 按需配置需要返回的celeb字段,以下为示例 _id, name, avatar, bio, // 子查询获取当前celeb关联的最新更新fact的时间戳 "latestFactUpdatedAt": *[_type == "fact" && references(^._id)] | order(_updatedAt desc)[0]._updatedAt } // 按最新fact更新时间倒序,刚新增/更新关联fact的celeb会自动排在列表顶部 | order(latestFactUpdatedAt desc)
逻辑说明与自定义调整
- 语句中
^._id指代外层遍历到的当前celeb文档ID,references(^._id)会匹配所有引用了该celeb的fact文档 - 子查询内先将关联到的fact按更新时间倒序排列,取第一条的
_updatedAt值作为当前celeb的排序依据 - 如果需要让没有任何关联fact的celeb按照自身更新时间参与排序,可将排序语句替换为
| order(coalesce(latestFactUpdatedAt, _updatedAt) desc),coalesce方法会在关联fact不存在时,自动取celeb自身的更新时间作为排序值 - 如果不需要展示无关联fact的celeb,可在最外层查询条件中增加过滤规则:
*[_type == "celeb" && count(*[_type == "fact" && references(^._id)]) > 0]
内容的提问来源于stack exchange,提问作者M.K. Safi
相关产品推荐
相关产品推荐

