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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:28:23