当前位置: 首页 > news >正文

gorm+mysql查询/修改json列相关操作汇总

目录

具体操作

1,查询JSON段落指定key的值是否有等于value的 或 指定key=value的数据记录

2,查询JSON段落中price>19的记录

3,查询JSON段中key为k0的记录

4、JSON段落中提取指定键值对到指定结构 

5,查询JSON数组是否包含某元素

6,修改JSON段中指定key的值

相关结构体及基础数据


具体操作

1,查询JSON段落指定key的值是否有等于value的 或 指定key=value的数据记录

查询ids列中k1=val1的记录

var demo1 []Demo
err = conn.Model(&Demo{}).Where("ids->>'$.k1' = ?", "val1").Find(&demo1).Error 

查询books列中price=19.1的记录

var demo1 []Demo
err = conn.Model(&Demo{}).Where("JSON_EXTRACT(`books`,'$.price')=?", 19.1).Find(&demo1).Error

2,查询JSON段落中price>19的记录

var demo1 []Demo
err = conn.Model(&Demo{}).Where("books->'$.price' > 19 ").Find(&demo1).Error

等价于:

SELECT * FROM `demos` WHERE  books->>'$.price' >= 19;

3,查询JSON段中key为k0的记录

var demo1 []Demo
err = conn.Model(&Demo{}).Where("JSON_EXTRACT(ids, '$.k0')").Find(&demo1).Error

4、JSON段落中提取指定键值对到指定结构 

var demo2 []Book
err = conn.Model(&Demo{}).Select("books->>'$.name' AS name").Find(&demo2).Error
// 注意:在非数组的JSON中可正常获取,若是数组型JSON则拿不到数据都是零值。

提取多个键值对(多个字段):

err = conn.Model(&Demo{}).Select("books->>'$.name' AS name", "books->>'$.price' AS price").Find(&demo2).Error

5,查询JSON数组是否包含某元素

查询ids列的JSON数组中包含a0的记录

var demo1 []Demo
err = conn.Model(&Demo{}).Where("JSON_CONTAINS(ids, JSON_ARRAY(?))", "a0").Find(&demo1).Error

等价于

SELECT * FROM `demos` WHERE JSON_CONTAINS(`ids`, JSON_ARRAY('a0') ) AND `demos`.`deleted_at` IS null;

6,修改JSON段中指定key的值

将id=1的ids列中key为k0的值修改为v00

err = conn.Model(&Demo{}).Where("id=?", 1).Update("ids", gorm.Expr("JSON_REPLACE(ids, '$.k0', ?)", "v00")).Error // JSON_SET也可

值得注意的是,这种修改操作不能作用于JSON数组中元素的修改,JSON数组中元素的修改需要用到'$[0].k0',即表示数组第一个位置的元素的k0的值。

相关结构体及基础数据

type Demo struct {entity.ModelIDs   string `json:"ids"  gorm:"column:ids; type:JSON;"`Books string `json:"books"  gorm:"column:books; type:JSON;"`
}type Book struct {Name  string  `json:"name" gorm:"column:name;type:varchar(20); not null;"`Price float64 `json:"price" gorm:"column:price;type:decimal(10,2); not null; default:0.00;"`
}demos := []Demo{Demo{IDs:   "{\"k0\":\"val0\"}",Books: "{\"name\":\"西游记\",\"price\": 19.0}",},Demo{IDs:   "{\"k1\":\"val1\",\"k0\":\"val2\"}",Books: "{\"name\":\"三国演义\",\"price\": 19.1}",},Demo{IDs:   `["a0","a1","a2"]`,Books: "[{\"name\":\"西游记\",\"price\": 19.0},{\"name\":\"三国演义\",\"price\": 19.1}]",},}err = conn.Create(demos).Error

http://www.lryc.cn/news/290351.html

相关文章:

  • CMake-Cookbook 第0章 配置环境
  • 优质硬盘检测工具SMART Utility,保障您的Mac数据安全
  • Spring: alibaba代码规范校验工具checkstyle
  • c++线程thread示例
  • Compose | UI组件(十一) | Spacer - 留白
  • PyTorch的nn.Module类的详细介绍
  • python使用activemq库ActiveMQClient类的连接activemq并订阅、发送和接收消息
  • 【Flutter 面试题】Dart是什么?Dart和Flutter有什么关系?
  • 前后台分离跨域交互
  • React16源码: React中处理LegacyContext相关的源码实现
  • Boost.Test资源及示例
  • 数据结构二叉树
  • JavaScript继承与原型链
  • SouthLeetCode-打卡24年01月第4周
  • Linux——磁盘和文件系统(一)
  • EasyCVR视频智能监管系统方案设计与应用
  • Ubuntu搭建国标平台wvp-GB28181-pro
  • LC 2808. 使循环数组所有元素相等的最少秒数
  • Qt|大小端数据转换
  • 禅道添加自定义字段
  • 蓝桥杯2024/1/26笔记-----基于PCF8591的电压采集装置
  • 【一】esp32芯片开发板环境搭建
  • PyTorch2ONNX-分类模型:速度比较(固定维度、动态维度)、精度比较
  • Docker命令快车道:一票通往高效开发之旅
  • IP类接口大全,含免费次数
  • LLMs 的记忆和信息检索服务器 Motorhead
  • vue3项目中让echarts适应div的大小变化,跟随div的大小改变图表大小
  • springboot启动异常
  • 直播主播之互动率与促单
  • Android 基础技术——Bitmap