我正在尝试集成NoSQL数据库来存储JSON数据,而不是存储JSON数据的SQL数据库(存储JSON对象的列)。
对于MongoDB,我只需执行以下操作即可插入JSON文件:
document = <JSON OBJECT>
collection.insert(document)
然而,对于Cassandra,根据这个网页:http://www.datastax.com/dev/blog/whats-new-in-cassandra-2-2-json-support
它不能少于架构,这意味着我需要事先创建一个表:
CREATE TABLE users (
id text PRIMARY KEY,
age int,
state text
);
然后插入数据:
INSERT INTO users JSON '{"id": "user123", "age": 42, "state": "TX"}';
问题是我想尝试使用Cassandra,我刚刚完成了DataStax的教程,但似乎我需要事先知道JSON数据的密钥,这是不可能的。
如果存在未知密钥,是否应该在有新数据列时更改表格?这听起来不是一个很好的设计决定。
有人能指出我正确的方向吗?感谢
答案 0 :(得分:11)
这种JSON支持非常误导 - 它是Cql支持的JSON,而不是存储。
或者如果有新数据列,我应该更改表格 是一个未知的密钥?这听起来不是一个非常好的设计 决定。
确实这不是一个好的决定 - 您在JSON中的字段可以跨实体使用不同的类型 - 一个列名称无法满足所有要求。此外,添加新字段需要跨群集进行架构传播,因此第一个插入(包含alter table + insert数据)将非常慢。
Cassandra没有为您提供任何内置机制,但您可以做的是将整个JSON放在一个字段中,并在其他单独的列中公开所需的属性。例如:
CREATE TABLE users (
id text PRIMARY KEY,
json text, //in json age and state
age int //explicit duplicated property - if you need e.g. index
);
顺便说一句。很久以前AFAIK Cassandra曾经支持你的案子,但现在它更“强烈打字”。
答案 1 :(得分:0)
CQL提供了创建和使用用户定义数据类型的功能。您可以创建数据类型来处理多个字段。 所以你可以简单地使用 &#39;创建类型&#39; cql命令 http://www.tutorialspoint.com/cassandra/cassandra_cql_user_defined_datatypes.htm