如何在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
相关产品推荐
相关产品推荐

