假设我有一个带有 JSON 数据的文本字段,如下所示:
{
"id": {
"name": "value",
"votes": 0
}
}
有没有办法编写一个可以找到id
然后增加votes
值的查询?
我知道我可以只检索我需要的 JSON 数据更新并重新插入更新版本,但我想知道有没有办法在不运行两个查询的情况下做到这一点?
UPDATE `sometable`
SET `somefield` = JSON_REPLACE(`somefield`, '$.id.votes', JSON_EXTRACT(`somefield` , '$.id.votes')+1)
WHERE ...
编辑
从 MySQL 5.7.8 开始,MySQL 支持原生 JSON 数据类型,可以有效访问 JSON 文档中的数据。
JSON_EXTRACT将允许您访问 JSON 字段中的特定 JSON 元素,而JSON_REPLACE将允许您更新它。
要指定您希望访问的 JSON 元素,请使用格式为的字符串
'$.[top element].[sub element].[...]'
因此,在您的情况下,要访问id.votes,请使用字符串'$.id.votes'。
上面的 SQL 代码演示了将所有这些放在一起以将 JSON 字段的值增加 1。
我认为对于这样的任务,您会被困在一个普通的 oldSELECT
后跟一个UPDATE
(在您解析 JSON 之后,增加您想要的值,然后将 JSON 序列化回来)。
您应该将这些操作包装在一个事务中,如果您使用的是 InnoDB,那么您也可以考虑使用SELECT ... FOR UPDATE
:http ://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
这有点切题,但我想我还要提到这是像 MongoDB 这样的 NoSQL 数据库非常擅长的操作类型。