在 Strapi 使用 PostgreSQL 数据库时,对 JSONB 类型的数组字段(如 categories)进行精确匹配需避免 $contains 导致的类型错误,应改用 $containsi 操作符实现安全、兼容的子数组元素筛选。
在 strapi 使用 postgresql 数据库时,对 jsonb 类型的数组字段(如 categories)进行精确匹配需避免 `$contains` 导致的类型错误,应改用 `$containsi` 操作符实现安全、兼容的子数组元素筛选。
Strapi 默认将数组字段(如 categories)存储为 PostgreSQL 的 JSONB 类型。当您尝试使用 filters[categories][$contains]=featured 时,Strapi 会生成类似 WHERE "categories" LIKE '%featured%' 的 SQL —— 但 PostgreSQL 不支持对 JSONB 字段直接使用 LIKE 运算符,因此报错:operator does not exist: jsonb ~~ unknown。
✅ 正确做法是使用 Strapi v4 内置的 数组包含过滤器:$containsi(大小写不敏感)或 $contains(大小写敏感),它们会被 Strapi 正确翻译为 PostgreSQL 的 ?(存在键/值)或 @>(包含)操作符,适用于 JSONB 数组。
例如,要获取所有 categories 数组中包含 "featured" 的已发布文章,使用以下 URL:
GET http://localhost:1337/api/generated-posts?filters[categories][$containsi]=featured&filters[publishedAt][$notNull]=true
? 注意:$containsi 在 Strapi 中专为数组字段设计,语义是 “数组中存在该字符串元素”(等价于 JavaScript 的 array.includes('featured')),而非子字符串匹配。它底层调用 PostgreSQL 的 ? 操作符(对 JSONB 数组),完全规避了 LIKE 类型错误。
? 其他常用数组过滤方式(推荐组合使用):
- 精确匹配多个标签:
?filters[categories][$containsi]=featured&filters[categories][$containsi]=investing
- 排除某类别:
?filters[categories][$notContainsi]=draft
- 多值 OR 查询(需配合 $or):
?filters[$or][0][categories][$containsi]=featured &filters[$or][1][categories][$containsi]=trending
⚠️ 注意事项:
- 避免使用 $in 作用于数组字段本身($in 用于标量字段的枚举匹配,如 id[$in]=1,2,3);
- 确保字段在 Strapi 内容类型构建器中定义为 array 类型(而非 json),以启用完整数组过滤能力;
- 若仍遇问题,请检查数据库迁移后字段是否仍为 JSONB(可通过 SELECT pg_typeof(categories) FROM generated_posts LIMIT 1; 验证);
- 开启 Strapi 日志(DEBUG=*)可查看实际生成的 SQL,便于调试。
总结:PostgreSQL + Strapi 场景下,对数组字段过滤请始终优先选用 $containsi 或 $contains,它们是 Strapi 官方适配 JSONB 的安全接口,兼具语义清晰性与数据库兼容性。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










