在 cassandra db 的 map<text,text> 中插入数据

Insert data in map<text,text> in cassandra db

我在 cassandra 数据库中有一列 map<text,text>

我在此 table 中插入数据为:

INSERT INTO "Table1" (col1) VALUES ({'abc':'abc','hello':'world','flag':'true'});

所以,在我的代码中,我可以获得如下数据:

{
    "abc":"abc",
    "hello":"world",
    "flag":"true"
}

但是,现在我想要这样的:

{
    "abc":"abc",
    "hello":"world",
    "flag":{
    "data":{ "hi":"cassandra"},
    "working":"no"
    }
}

为此,当我尝试插入查询时,它说它与类型不匹配 map<text,text>

我怎样才能完成这项工作?

这里的问题(在您的第二个示例中)是 col1 的类型是 map<text,text>flag 是复杂类型并且不再匹配该定义。解决此问题的一种方法是为每个 属性 创建单独的 TEXT 列,并为 flag 及其包含的数据创建用户定义的类型:

> CREATE TYPE flagtype (data map<text,text>,working text);
> CREATE TABLE table1 (abc text,
                     hello text,
                      flag frozen<flagtype>
                     PRIMARY KEY (abc));

然后插入第二个示例中的 JSON 文本即可。

> INSERT INTO table1 JSON '{"abc":"abc",
                          "hello":"world",
                           "flag":{"data":{"hi":"cassandra"},
                                      "working":"no"}}';

> SELECT * FROM table1;

 abc | flag                                       | hello
-----+--------------------------------------------+-------
 abc | {data: {'hi': 'cassandra'}, working: 'no'} | world

(1 rows)

如果您坚持使用 map<text,text> 类型,并希望值 JSON 子属性被视为一个大的 text 字符串,您可以尝试一个简单的 table 像这样:

CREATE TABLE Whosebug.table2 (
  key1 text PRIMARY KEY,
  col1 map<text, text>);

而在你的 INSERT 上,只需转义内引号:

> INSERT INTO table2 JSON '{"key1":"1","col1":{"abc":"abc","hello":"world"}}';
> INSERT INTO table2 JSON '{"key1":"2","col1":{"abc":"abc","hello":"world",
                  "flag":"{\"data\":{\"hi\":\"cassandra\"},\"working\":\"no\"}"}}';

> SELECT * FROm table2;

 key1 | col1
------+----------------------------------------------------------------------------------------
    2 | {'abc': 'abc', 'flag': '{"data":{"hi":"cassandra"},"working":"no"}', 'hello': 'world'}
    1 |                                                       {'abc': 'abc', 'hello': 'world'}

(2 rows)

这有点老套,可能需要在您的应用程序端进行一些额外的解析。但它可以解决必须定义每一列的问题。