使用Sequelize与MySQL无法删除JSON数组元素的问题求助
解决Sequelize操作MySQL JSON数组删除元素的问题
你用的array_remove是PostgreSQL专属函数,MySQL并不支持,所以才会报错。下面给你几种适配MySQL的可行方案:
方法一:用MySQL的JSON_REMOVE按索引删除
如果知道要删除的元素在数组中的索引,直接用MySQL自带的JSON_REMOVE函数,指定数组路径$[索引]即可:
await category.update({ array_Of_food: Sequelize.fn('JSON_REMOVE', Sequelize.col('array_of_food'), `$[${index}]`) });
注意要保证代码里的字段名和数据库表中的字段名一致,别写错大小写。
方法二:代码层处理后更新
不想折腾MySQL的JSON函数的话,最简单的方式就是先把数组查询出来,在代码里删掉目标元素,再更新回数据库:
// 获取当前数组,为空则设为默认空数组 const currentFoods = category.dataValues.array_Of_food || []; // 删除指定索引的元素,splice会直接修改原数组 currentFoods.splice(index, 1); // 将修改后的数组更新回数据库 await category.update({ array_Of_food: currentFoods });
这种方式直观好理解,但要注意如果有多个请求同时修改该数组,可能会出现数据覆盖问题,适合并发量低的场景。
方法三:按元素值删除(仅删除第一个匹配项)
要是不知道元素索引,只知道要删除的元素值,可以用JSON_SEARCH定位元素路径,再配合JSON_REMOVE完成删除:
// 示例:删除值为"pizza"的第一个匹配元素 await category.update({ array_Of_food: Sequelize.fn( 'JSON_REMOVE', Sequelize.col('array_of_food'), // JSON_SEARCH返回带引号的路径,需用JSON_UNQUOTE去除引号 Sequelize.fn('JSON_UNQUOTE', Sequelize.fn('JSON_SEARCH', Sequelize.col('array_of_food'), 'one', 'pizza')) ) });
这里的'one'表示只删除第一个匹配元素,如果要删除所有匹配项,MySQL原生函数无法一次性完成,要么循环处理,要么编写存储过程,一般不推荐这种复杂操作。
内容的提问来源于stack exchange,提问作者kingsJayson
相关产品推荐
相关产品推荐

