mysql 把 JSON 字段作為查詢列


查詢 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 字段,查詢的速度一定會很慢很慢。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM