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

如何在PostgreSQL中用Sequelize或原生查询jsonb字段筛选userId=649?

筛选PostgreSQL jsonb数组中指定userId的行

针对user表中member列(jsonb类型,存储对象数组)的场景,以下两种方式可以筛选出包含userId=649元素的数据:

一、PostgreSQL原生SQL查询

方法1:使用@>包含操作符(简洁高效)

利用PostgreSQL jsonb的@>操作符,检查数组是否包含指定结构的元素:

SELECT *
FROM "user"
WHERE member @> '[{"user": {"userId": 649}}]'::jsonb;

方法2:展开数组后筛选(适用于复杂条件)

通过jsonb_array_elements展开数组元素,再匹配目标userId:

SELECT *
FROM "user"
WHERE EXISTS (
  SELECT 1
  FROM jsonb_array_elements(member) AS elem
  WHERE elem->'user'->>'userId' = '649'
);

注:->>用于提取文本类型的字段值,若userId存储为数字类型,也可改用elem->'user'->'userId' = '649'::jsonb。

二、Sequelize实现方式

方法1:使用Sequelize内置操作符

导入Op后,直接使用contains操作符匹配jsonb结构:

const { Op } = require('sequelize');
const User = require('./models/User'); // 替换为你的User模型路径

const targetUsers = await User.findAll({
  where: {
    member: {
      [Op.contains]: [{ user: { userId: 649 } }]
    }
  },
  raw: true // 若需要原始数据而非模型实例,可添加此选项
});

方法2:Sequelize原生查询(兼容所有场景)

如果内置方法不生效,直接执行原生SQL:

const sequelize = require('./sequelize-instance'); // 替换为你的Sequelize实例

const targetUsers = await sequelize.query(
  `SELECT * FROM "user" WHERE member @> '[{"user": {"userId": 649}}]'::jsonb`,
  { type: sequelize.QueryTypes.SELECT }
);

内容的提问来源于stack exchange,提问作者Michy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:35:13