【问题标题】:Query JSON Attributes from JSON-formatted Column in Database从数据库中 JSON 格式的列中查询 JSON 属性
【发布时间】:2017-03-15 17:31:43
【问题描述】:

这是我面临的问题

我有一个名为 GAMELOG 的表(可以是 SQL 表或 NoSQL 列族),如下所示:

ID INT, 请求日期, 请求 VARCHAR, 答复日期, 响应 VARCHAR

REQUESTMESSAGE 和 RESPONSEMESSAGE 列采用 JSON 格式。 例如,REQUESTMESSAGE 中的特定值是:

{
    "name" : "John",
    "specialty" : "Wizard",
    "joinDate" : "17-Feb-1988"
}

对于响应是:

{
    "name" : "John Doe",
    "specialty" : "Wizard",
    "joinDate" : "17-Feb-1988",
    "level" : 89,
    "lastSkillLearned" : "Megindo"
}

现在,我的表中的数据已经变得非常大(大约十亿行,几 TB 的硬盘空间)

我想要做的是查询包含“name”的 JSON 属性的行,该属性在 REQUESTMESSAGE 中的值为“John”

我对 SQL 数据库的了解,以及我之前使用过的 Oracle,我必须将 REQUESTMESSAGE 和 RESPONSEMESSAGE 设为 CLOB,并使用 LIKE 进行查询,即

SELECT * FROM GAMELOG WHERE REQUESTMESSAGE LIKE '%"name" : "John"%';

但是,结果非常缓慢和痛苦。

现在,我搬到 Cassandra,但我不知道如何正确查询它,我还没有使用 Apache Hadoop 来获取数据,我打算稍后使用它来获取数据。

我的问题是,是否有数据库产品支持查询以在表/列族中选择 JSON 格式的 JSON 属性?据我所知,MongoDB 以 JSON 格式存储文档,但这意味着我的所有列族都将存储为 JSON,即

{
    "ID" : 1,
    "REQUESTMESSAGE" : "{
                          "name" : "John",
                          "specialty" : "Wizard",
                          "joinDate" : "17-Feb-1988"
                        }",
    "REQUESTDATE" : "17-Feb-1967"
    "RESPONSEMESSAGE" : "{
                            "name" : "John Doe",
                            "specialty" : "Wizard",
                            "joinDate" : "17-Feb-1988",
                            "level" : 89,
                            "lastSkillLearned" : "Megindo"
                         }",
     "RESPONSEDATE" : "17-Feb-1967"
}

我仍然无法在 REQUESTMESSAGE 列中获取 JSON 属性(如果我错了,请纠正我)

非常感谢

【问题讨论】:

    标签: sql json cassandra nosql


    【解决方案1】:

    如果您不致力于将数据存储在 Apache Cassandra 中,MySQL 具有可以从 JSON 值中提取数据的 SQL 查询函数,特别是,您可能需要查看 JSON_EXTRACT 函数:https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html

    在您的情况下,查询应如下所示:

    SELECT REQUESTMESSAGE, JSON_EXTRACT(REQUESTMESSAGE, "$.name")  
    FROM GAMELOG 
    WHERE JSON_EXTRACT(REQUESTMESSAGE, "$.name") = "John";
    

    【讨论】:

    • 您好,谢谢您的回答。性能查询呢?使用like 选择是否更好?
    • 不知道 MySQL 如何处理此类查询或您的数据将如何存储/索引,我无法确定性能。你必须自己测试一下。
    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2021-04-10
    相关资源
    最近更新 更多