【问题标题】:Is it possible for CQL to parse a JSON object to insert data?CQL 是否可以解析 JSON 对象以插入数据?
【发布时间】:2023-02-07 19:59:15
【问题描述】:

到目前为止,从我看来,Cassandra 似乎是不可能的。但我想我会试一试:

如何选择从 json 对象字符串解析的 json 属性的值,并将其用作 Cassandra 中更新/插入语句的一部分?

例如,我得到了 json 对象:

{
    id:123,
    some_string:"hello there",
    mytimestamp: "2019-09-02T22:02:24.355Z"
}

这是表定义:

CREATE TABLE IF NOT EXISTS myspace.mytable (
    id text,
    data blob,
    PRIMARY KEY (id)
);

现在需要知道的是,出于给定的原因,数据字段将设置为 json 字符串。换句话说,给定的 json 和表列之间没有 1:1 的映射,但数据字段包含 json 对象作为一种 blob 值。

...是否可以将给定 json 对象的时间戳值作为插入语句的一部分进行解析?

我的意思的伪代码示例,这显然不起作用($myJson 是上面 json 对象字符串的占位符):

INSERT INTO myspace.mytable (id, data)
  VALUES (123, $myJson)
  USING timestamp toTimeStamp($myJson.mytimestamp)

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    您详细说明的内容可用于 Cassandra。

    时间戳

    要在查询中插入时间戳,应将其格式化为 ISO 8601 字符串。可以在here 找到示例示例。在您的代码中,您可能必须将传入值转换为预期的类型和格式。

    斑点:

    Blob 期望存储二进制数据,因此它不能在 CQL 查询中作为字符串临时放置。 (如果你想编码base64,你可以使用TEXT类型来做)

    当您需要插入二进制数据时,您还需要提供正确的类型。例如,如果您使用 Javascript 需要提供一个缓冲区,如 documentation 中所述,那么当您执行查询时,您将参数外部化

    const sampleId = 123;
    const sampleData = Buffer.from('hello world', 'utf8');
    const sampleTimeStamp = new Date();
    client.execute('INSERT INTO myspace.mytable (id, data) VALUES (?, ?) USING timestamp toTimeStamp(?)', [ sampleId, sampleData, sampleTimeStamp ]);
    

    【讨论】:

      【解决方案2】:

      快速的回答是否定的,用 CQL 不可能做到这一点。

      规范是在您的应用程序中解析 JSON 对象的元素以提取相应的值来构造 CQL 语句。

      作为旁注,我不鼓励使用 CQL blob 类型,因为如果 blob 大小超过 1MB,可能会出现性能问题。如果是 JSON,请考虑将其存储为 CQL text 类型。干杯!

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2013-09-14
        • 1970-01-01
        • 2019-10-13
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        相关资源
        最近更新 更多