Strapi中基于数组元素过滤Post数据(PostgreSQL环境)
问题:PostgreSQL环境下过滤包含指定元素的数组字段失败
场景还原
帖子数据结构如下:
{ "id": 23, "attributes": { "title": " Ea omnis voluptatem quo error quos qui quia", "content": "Lorem ipsum dolor sit amet. Ut enim sunt 33 molestiae ullam ad maxime placeat et quia iusto. Aut rerum eius est voluptatem sint ut dolorum accusamus At perspiciatis incidunt in delectus eligendi et iste dolore ea tenetur necessitatibus?", "createdAt": "2023-10-17T04:46:50.824Z", "updatedAt": "2023-10-17T04:52:35.871Z", "publishedAt": "2023-10-17T04:50:43.222Z", "categories": ["featured", "investing"], "seoTags": ["investing"], "newsDate": "2023-10-17T04:30:38.237Z", "timeToRead": 10, "author": "Author" } }
需要筛选所有categories数组中包含featured的帖子,在SQLite环境下使用以下查询可正常工作:
http://localhost:1337/api/generated-posts?filters[categories][$contains]=featured
切换到PostgreSQL后出现错误:
error: select "t0".* from "public"."generated_posts" as "t0" where ("t0"."categories" like $1 and "t0"."published_at" is not null) limit $2 - operator does not exist: jsonb ~~ unknown
尝试$in操作符同样无效:
http://localhost:1337/api/generated-posts?filters[categories][$in]=featured
原因分析
SQLite会将数组字段存储为文本,$contains可通过like匹配实现;但PostgreSQL中Strapi默认将数组字段存储为jsonb类型,like操作符无法作用于该类型,导致语法错误。而$in是用于判断字段值是否在指定集合中,不适用于数组元素的包含校验。
解决方案
方案1:调整$contains参数格式
针对PostgreSQL的jsonb类型数组,需传入数组格式的查询参数:
http://localhost:1337/api/generated-posts?filters[categories][$contains][0]=featured
若使用POST请求,可直接传JSON格式参数:
{ "filters": { "categories": { "$contains": ["featured"] } } }
方案2:修改字段存储类型
在Strapi模型定义中,将categories字段设置为枚举类型并勾选“允许多选”,此时PostgreSQL会将其存储为SQL原生数组类型,原有的$contains查询即可正常生效。
内容的提问来源于stack exchange,提问作者saimarshadd
相关产品推荐
相关产品推荐

