查詢 JSON 字段比較麻煩,有一下幾種辦法
- 若該字段是個JSON對象,用
字段 -> '$.json屬性' = '某值'
進行查詢 - 若該字段是個 JSON 數組,用 JSON_CONTAINS(字段, JSON_OBJECT('json屬性', "內容"))
舉例一張表
CREATE TABLE `template` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(50) NOT NULL DEFAULT ''
`principals` json DEFAULT NULL COMMENT '負責人',
`department` json DEFAULT NULL COMMENT '所屬部門',
PRIMARY KEY (`id`),
) ENGINE=InnoDB CHARSET=utf8mb4;
principals 是個 json 數組
principals
[{"id": "2905688", "name": "楊三"}, {"id": "2904598", "name": "趙六"}]
[{"id": "2135687", "name": "卓七"}]
[{"id": "2546576", "name": "王五"}]
department 是個對象
department
{"id": 14250825, "name": "基礎研發部"}
{"id": 14250826, "name": "金服事業部"}
查詢對象
查詢 department 為基礎研發部的行
select * from template where department -> '$.name' = '基礎研發部'
查詢數組
查詢 principals 里叫王五的
select * from template where JSON_CONTAINS(principals, JSON_OBJECT('name', '王五'))
用 sequelize 查詢
const options = {
offset: page.offset,
limit: page.limit,
where: {
},
raw: true,
};
// JSON_CONTAINS mysqk 5.7 加入,可以查看文檔
// https://dev.mysql.com/doc/refman/5.7/en/json-functions.html
options.where = {
[Op.and]: [
options.where,
Sequelize.fn(
'JSON_CONTAINS',
Sequelize.col('department'),
JSON.stringify({
id: parseInt(params.departmentId),
}),
),
Sequelize.fn(
'JSON_CONTAINS',
Sequelize.col('principals'),
JSON.stringify(condition)
),
],
};
return app.model.dbRr.template.findAndCountAll(options);
注意
JSON 字段是無法作為索引存在的,故而數據量若能到達百萬級別,則千萬別直接查這種 JSON 字段,查詢的速度一定會很慢很慢。