因为业务从 mongodb 迁移到 mysql5.7,有一些 mongo 特殊的查询就需要修改。
想做到尽可能少改代码,并且需要支持 mongodb 的 $eleMatch 查询 (感觉难得不行)
CREATE TABLE `Student` (
`id` bigint AUTO_INCREMENT PRIMARY KEY,
`name` varchar(64),
`gender` varchar(32),
`data` json DEFAULT NULL
)
上面是简化后的表结构,实际上字段很丰富。主要是 data 字段是 JSON 格式,
大概长这样:
[
{"date":"2021-01-01", "is_active": true, "tags":["A", "B", "C", "D"]},
{"date":"2021-06-01", "is_active": false, "tags":["C", "D"]},
]
想查询如下:
名字为 “小明”,性别为“女”,
data.date 在 2020-08-01 到 2020-05-01 之间,
并且 is_active 为 true,
tags 中含有"C" 和 "D"的 -- 这个可以通过读到内存后过滤
查了一下午,试用了各种 json_extract 类似的函数,都没办法做到 [数组内的 Object 同时满足多个条件]
网上还有说用 mysql8.0 自带的 json_table 函数,,目前还没有测试,不知道能不能见索引。
求有经验的老哥说一下,跪谢跪谢跪谢跪谢跪谢跪谢跪谢
1
AlexaZhou 2021-10-15 18:44:21 +08:00
现在遇到问题:
没办法做到 [数组内的 Object 同时满足多个条件] 那么用多个 json 方法,每个方法判断一个条件,再用 where 条件一 and 条件二 ... 连接不就可以? |
2
wuwukai007 2021-10-15 18:51:16 +08:00
json_contains + json_object
|
3
0x0208v0 OP @AlexaZhou 不行的
``` 假如 data 的内容是这样的 [{"sub_timeoff_date": "2020-12-31", "actual_exchange_date": ""}, {"sub_timeoff_date": "2021-01-01", "is_confirm_exchange": false}, {"sub_timeoff_date": "2021-06-01"}] ``` 那么这个 sql 查询就能匹配到 ``` SELECT * FROM User WHERE json_extract(data, '$[*].actual_exchange_date') = json_array('') and json_extract(data, '$[*].is_confirm_exchange') = json_array(false) limit 1 ``` |
4
moen 2021-10-15 21:45:49 +08:00 1
讲真,真要关系型数据库玩 json 为什么不用 PostgreSQL ?
|
6
byaiu 2021-10-16 11:25:27 +08:00 via iPhone
建新表吧……
|
7
0x0208v0 OP @wuwukai007 试过了确实有些边界情况没办法满足
|
9
swcat 2021-10-17 00:30:31 +08:00 1
json_table 能做, 我做过, 性能不大好, 可能我用的方式不对
|