如何使用Sanity Groq实现数组的多条件动态筛选?
问题说明
需要查询的文档category字段为字符串数组,结构示例如下:
"category": [ "A", "B", "C" ]
原先使用的GROQ筛选语句:
*[ "A" || "C" in category ]{ }
该语句存在逻辑错误,仅能匹配到category包含"C"的文档,无法命中包含"A"的文档,需求是不需要为每个筛选值重复编写in category判断,支持动态更新筛选条件完成匹配。
错误原因
GROQ中in运算符优先级高于逻辑或||,上述语句实际解析逻辑为"A" || ("C" in category),完全不符合「A或C任意一个存在于category数组中就匹配」的预期。
实现方案
GROQ原生支持数组对数组的包含匹配,不需要逐个写值判断:
- 把所有需要匹配的筛选值整理为一个数组,直接判断该数组是否有元素存在于
category数组中即可,只要任意一个值匹配就会命中文档。
固定筛选值的写法示例:
*[ ["A", "C"] in category[] ]{ // 在此处配置需要返回的文档字段 }
动态传入筛选条件的写法示例,后续增删筛选值只需要修改传入的参数,不需要调整查询语句逻辑:
// 传入参数格式示例:{ "matchCategories": ["A", "C", "E"] } *[ $matchCategories in category[] ]{ // 在此处配置需要返回的文档字段 }
补充:如果需要实现「category字段必须同时包含所有筛选值」的全匹配需求,把判断条件替换为
count( $matchCategories in category[] ) == count($matchCategories)即可。
内容的提问来源于stack exchange,提问作者B Ric
相关产品推荐
相关产品推荐

